zoukankan      html  css  js  c++  java
  • 正式班D23

    2020.11.05星期四  正式班D23

    12.3.3 HUP信号

    • 在关闭终端时,终端会收到Linux HUP信号(hangup信号),关闭其所有子进程。

    • 想让进程一直在后台运行不受关闭终端的影响,有以下四种方案:

      nohup

      在命令前加上nohup,就会从终端解除进程的关联

      同时在结尾加上&来将命令放入后台运行

      # 1、在终端1输入
      [root@ccc ~]# nohup ping baidu.com &>/dev/null &
      [root@ccc ~]# ps -elf | grep [p]ing  # 查看进程
      4 S root       2034   1979  0  80   0 - 37522 poll_s 15:11 pts/4    00:00:00 ping baidu.com
                  
      # 2、关闭终端1
      
      # 3、在终端2查看
      [root@ccc ~]# ps -elf | grep [p]ing  # 查看进程,父进程变为1即systemd进程
      4 S root       2034      1  0  80   0 - 37522 poll_s 15:11 ?        00:00:00 ping baidu.com
      

      setsid

      原理与nohup一致,但setsid直接将进程的父PID设为1,即让运行的进程归属init的子进程

      除非init结束,该子进程才会结束。当前终端结束不会影响进程的运行

      # 1、在终端1执行命令
      [root@ccc ~]# setsid ping baidu.com &>/dev/null &
      [1] 2062
      [root@ccc ~]# ps -elf | grep [p]ing
      4 S root       2063      1  0  80   0 - 37522 poll_s 15:19 ?        00:00:00 ping baidu.com
      [1]+  完成                  setsid ping baidu.com &>/dev/null
      
      # 2、关闭终端1
      
      # 3、在终端2查看
      [root@ccc ~]# ps -elf | grep [p]ing
      4 S root       2063      1  0  80   0 - 37522 poll_s 15:19 ?        00:00:00 ping baidu.com
      

      在子shell中启动进程

      命令加上括号

      # 1、在终端1输入命令
      [root@ccc ~]# (ping vaidu.com &>/dev/null &)
      [root@ccc ~]# ps -elf | grep [p]ing
      4 S root       2103      1  0  80   0 - 37522 poll_s 15:24 pts/4    00:00:00 ping vaidu.com
      
      # 2、关闭终端1
      
      # 3、在终端2查看
      [root@ccc ~]# ps -elf | grep [p]ing
      4 S root       2103      1  0  80   0 - 37522 poll_s 15:24 ?        00:00:00 ping vaidu.com
      

      screen

      让进程运行在新的会话里,从而成为不属于此终端的子进程,关闭终端不会被带走

      # 安装screen
      [root@ccc ~]# yum install screen -y
      
      # 用法1
      # 运行命令
      终端1输入命令
      [root@ccc ~]# screen vim 111.py
      [root@ccc ~]# ps -elf | grep [v]im
      4 S root 2154 2076 0 80 0 - 31934 sys_pa 15:43 pts/6 00:00:00 screen vim 111.py
      5 S root 2155 2154 0 80 0 - 31967 poll_s 15:43 ?     00:00:00 SCREEN vim 111.py
      4 S root 2156 2155 0 80 0 - 37444 poll_s 15:43 pts/2 00:00:00 vim 111.py
                  
      关闭终端1
      
      在终端2查看
      [root@ccc ~]# ps -elf | grep [v]im
      5 S root       2155      1  0  80   0 - 31967 poll_s 15:43 ?        00:00:00 SCREEN vim 111.py
      4 S root       2156   2155  0  80   0 - 37444 poll_s 15:43 pts/2    00:00:00 vim 111.py
      
      # 重新连接会话
      [root@ccc ~]# screen -ls
      There are screens on:
      	2155.pts-6.ccc	(Detached)
      	1678.pts-0.ccc	(Attached)
      2 Sockets in /var/run/screen/S-root.
      [root@ccc ~]# screen -r 2155
      
      # 用法2
      # 运行命令
      [root@ccc ~]# screen -S cjx_pm
      # screen会创建一个执行shell的全屏窗口。可执行任意shell程序
      # 输入exit退出该窗口(若该screen窗口唯一,则screen会话结束,否则切换到前一窗口)
      
      # 重新连接会话
      [root@ccc ~]# screen -r cjx_pm
      # 已经指定了名字,可以不用进程ID直接用名字
      
      # 测试
      [root@ccc ~]# screen
      [root@ccc ~]# n=1;while true;do echo $n;sleep 1;((n++));done;
      按下ctrl+a和ctrl+d
      此时整个终端关闭,进程并未结束
      [root@ccc ~]# screen -ls
      There are screens on:
      	2266.pts-4.ccc	(Detached)
      Remove dead screens with 'screen -wipe'.
      1 Sockets in /var/run/screen/S-root.
      [root@ccc ~]# screen -r 2266  # 进程依旧在运行
      
      # 远程演示
      在终端1
      [root@ccc ~]# screen -S cz
      
      在终端2执行的命令,终端1会同步显示
      [root@ccc ~]# screen -x cz
      

    12.4 查看网络状态

    • netstat

      [root@ccc ~]# netstat -tunlp
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address       Foreign Address     State    PID/Program name    
      tcp        0      0 0.0.0.0:22          0.0.0.0:*           LISTEN   844/sshd            
      tcp        0      0 127.0.0.1:25        0.0.0.0:*           LISTEN   922/master          
      tcp6       0      0 :::22               :::*                LISTEN   844/sshd            
      tcp6       0      0 ::1:25              :::*                LISTEN   922/master          
      udp        0      0 127.0.0.1:323       0.0.0.0:*                    532/chronyd         
      udp6       0      0 ::1:323             :::*                         532/chronyd       
                              
      -t  # tcp协议
      -u  # udp协议
      -l  # listen
      -p  # PID/Program name
      -n  # 不反解,不将IP地址解析为主机名,不将端口号解析成协议名
      
    • lsof:列出打开文件(lists openfiles)

      默认 : 没有选项,lsof列出活跃进程的所有打开文件
      组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数
      -a : 结果进行“与”运算(而不是“或”)
      -l : 在输出显示用户ID而不是用户名
      -h : 获得帮助
      -t : 仅获取进程ID
      -U : 获取UNIX套接口地址
      -F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)
          
      # 1、安装
      [root@ccc ~]# yum install -y lsof
      
      # 2、使用
      # -i显示所有连接
      [root@ccc ~]# lsof -i
      COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      chronyd  532 chrony    5u  IPv4  16273      0t0  UDP localhost:323 
      chronyd  532 chrony    6u  IPv6  16274      0t0  UDP localhost:323 
      sshd     844   root    3u  IPv4  19131      0t0  TCP *:ssh (LISTEN)
      sshd     844   root    4u  IPv6  19140      0t0  TCP *:ssh (LISTEN)
      master   922   root   13u  IPv4  19666      0t0  TCP localhost:smtp (LISTEN)
      master   922   root   14u  IPv6  19667      0t0  TCP localhost:smtp (LISTEN)
      sshd    2182   root    3u  IPv4  47242      0t0  TCP ccc:ssh->192.168.29.2:64066 (ESTABLISHED)
      # -i 6仅获取IPV6流量
      [root@ccc ~]# lsof -i 6
      COMMAND PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      chronyd 532 chrony    6u  IPv6  16274      0t0  UDP localhost:323 
      sshd    844   root    4u  IPv6  19140      0t0  TCP *:ssh (LISTEN)
      master  922   root   14u  IPv6  19667      0t0  TCP localhost:smtp (LISTEN)
      # -i:22仅获取22端口的连接
      [root@ccc ~]# lsof -i:22
      COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      sshd     844 root    3u  IPv4  19131      0t0  TCP *:ssh (LISTEN)
      sshd     844 root    4u  IPv6  19140      0t0  TCP *:ssh (LISTEN)
      sshd    2182 root    3u  IPv4  47242      0t0  TCP ccc:ssh->192.168.29.2:64066 (ESTABLISHED)
      # -i@host显示指定到主机的连接
      # -i@host:port显示基于主机与端口的连接
      # -u 用户 显示指定用户打开了什么
      # -u ^用户 显示除指定用户外其他所有用户做的事
      # kill -9 `lsof -t -u 用户`  消灭指定用户运行的所有东西
      # -c 命令  查看指定的命令正在使用的文件和网络连接
      # -p PID  查看指定进程ID已打开的内容
      # -t  只返回PID
      
    • netstat -an

      [root@ccc ~]# netstat -an 
      [root@ccc ~]# netstat -an | grep :22
      tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
      tcp        0     52 192.168.29.55:22        192.168.29.2:64066      ESTABLISHED
      tcp6       0      0 :::22                   :::*                    LISTEN  
      

    12.5 proc文件系统

    12.5.1 查看硬盘状态df

    • 显示目录或文件大小du

      [root@ccc ~]# du -sh /root
      96K	/root
      
    • 查看硬盘状态df

      [root@ccc ~]# df -h
      文件系统        容量  已用  可用 已用% 挂载点
      devtmpfs        476M     0  476M    0% /dev
      tmpfs           487M     0  487M    0% /dev/shm
      tmpfs           487M  7.6M  479M    2% /run
      tmpfs           487M     0  487M    0% /sys/fs/cgroup
      /dev/sda3       7.7G  6.3G  1.5G   82% /
      /dev/sda1       473M  123M  351M   26% /boot
      tmpfs            98M     0   98M    0% /run/user/0
      
      [root@ccc ~]# df -T
      文件系统       类型       1K-块    已用    可用 已用% 挂载点
      devtmpfs       devtmpfs  487140       0  487140    0% /dev
      tmpfs          tmpfs     497840       0  497840    0% /dev/shm
      tmpfs          tmpfs     497840    7756  490084    2% /run
      tmpfs          tmpfs     497840       0  497840    0% /sys/fs/cgroup
      /dev/sda3      xfs      8034304 6529180 1505124   82% /
      /dev/sda1      xfs       484004  125552  358452   26% /boot
      tmpfs          tmpfs      99572       0   99572    0% /run/user/0
      

    12.5.2 查看内存状态free

    • 内存:/proc/meminfo

      [root@ccc ~]# less /proc/meminfo 
      
    • free

      [root@ccc ~]# free
                    total        used        free      shared  buff/cache   available
      Mem:         995684      148580      454780        7756      392324      655336
      Swap:       1952764           0     1952764
      
      [root@ccc ~]# free -m
                    total        used        free      shared  buff/cache   available
      Mem:            972         145         444           7         383         639
      Swap:          1906           0        1906
      
      [root@ccc ~]# free -wm
                    total        used        free      shared     buffers       cache   available
      Mem:            972         144         444           7           2         381         640
      Swap:          1906           0        1906
      
      # free指当前完全没有被程序使用的内存
      # cache在有需要的时候可以被释放出来供其他进程使用(不是释放所有)
      # available是真正表明系统目前提供给新启动程序的内存
      
    • 释放内存

      [root@ccc ~]# free
                    total        used        free      shared  buff/cache   available
      Mem:         995684      148580      454780        7756      392324      655336
      Swap:       1952764           0     1952764
      [root@ccc ~]# cat /proc/sys/vm/drop_caches 
      0
      [root@ccc ~]# echo 3>/proc/sys/vm/drop_caches
      [root@ccc ~]# free
                    total        used        free      shared  buff/cache   available
      Mem:         995684      148012      453520        7756      394152      655904
      Swap:       1952764           0     1952764
      
    • 内核启动参数

      [root@ccc ~]# cat /proc/cmdline 
      BOOT_IMAGE=/vmlinuz-3.10.0-1127.el7.x86_64 root=UUID=b43c52c4-89a7-48d2-83e4-6e8d35553e64 ro spectre_v2=retpoline rhgb quiet LANG=zh_CN.UTF-8
      [root@ccc ~]# uptime
       17:29:15 up  6:35,  2 users,  load average: 0.00, 0.01, 0.05
      
    • 卸载/proc及重新挂载

      [root@ccc ~]# umount /proc/ -l  # 卸载
      [root@ccc ~]# free -m  # free -m、uptime、lscpu、toop都用不了
      Error: /proc must be mounted
        To mount /proc at boot you need an /etc/fstab line like:
            proc   /proc   proc    defaults
        In the meantime, run "mount proc /proc -t proc"
      [root@ccc ~]# mount -t proc proc /proc/  # 重新挂载
      

    12.5.3 查看CPU状态lscpu

    • CPU:/proc/cpuinfo

      [root@ccc ~]# grep "processor" /proc/cpuinfo | wc -l  # 逻辑CPU个数
      1
      [root@ccc ~]# grep "physical id" /proc/cpuinfo | wc -l  # 物理CPU个数
      1
      [root@ccc ~]# grep "cpu cores" /proc/cpuinfo | wc -l  # CPU核数
      1
      [root@ccc ~]# cat /proc/cpuinfo   # 查看cpu信息
      [root@ccc ~]# lscpu
      

    12.6 管理后台进程(了解)

    • 了解即可

      [root@ccc ~]# sleep 5000 &  					# 后台运行
      [1] 4487
      [root@ccc ~]# sleep 4000 						# 前台运行
      ^Z												# ctrl+z停止
      [2]+  已停止               sleep 4000
      [root@ccc ~]# jobs								# []编号是作业编号
      [1]-  运行中               sleep 5000 &
      [2]+  已停止               sleep 4000
      [root@ccc ~]# bg %2								# 让作业2在后台运行
      [2]+ sleep 4000 &
      [root@ccc ~]# jobs
      [1]-  运行中               sleep 5000 &
      [2]+  运行中               sleep 4000 &
      [root@ccc ~]# fg %1								# 将作业1调回到前台
      sleep 5000
      ^C												# ctrl+c终止
      [root@ccc ~]# jobs
      [2]+  运行中               sleep 4000 &
      [root@ccc ~]# kill %2							# 杀死作业2
      [root@ccc ~]# jobs
      [2]+  已终止               sleep 4000
      [root@ccc ~]# jobs
      

    12.7 管道

    12.7.1 管道概念

    • 管道用于进程间的通信
    • 管道操作符号"|"主要用于连接左右两个命令。将左边的命令标准输出,交给右侧命令的标准输入
    • 无法传递标准错误输出至后者命令
    • 格式:cmd1 | cmd2[... | cmdn]

    12.7.2 xargs

    • 参数传递,让一些不支持管道的命令可以使用管道技术

      [root@ccc ~]# which cat
      /usr/bin/cat
      [root@ccc ~]# which cat | xargs ls -l
      -rwxr-xr-x. 1 root root 54080 8月  20 2019 /usr/bin/cat
      

    12.7.3 实例

    • 统计当前/etc/passwd中用户使用的shell类型

      [root@ccc ~]# awk -F: '{print $7}' /etc/passwd | sort | uniq -c
            4 /bin/bash
            1 /bin/sync
            1 /sbin/halt
           17 /sbin/nologin
            1 /sbin/shutdown
      
    • 打印当前所有的IP

      [root@ccc ~]# ip addr | grep 'inet' | awk '{print $2}' |awk -F"/" '{print $1}'
      127.0.0.1
      ::1
      192.168.29.55
      fe80::20c:29ff:fec0:5db3
      
    • 打印根分区已用空间百分比(仅数字)

      [root@ccc ~]# df -P | grep '/$' |awk '{print $5}' | awk -F"%" '{print $1}'
      82
      

    12.7.4 管道中的tee技术

    • -a # 追加

      [root@ccc ~]# ip addr | grep 'inet' | awk '{print $2}' |awk -F"/" '{print $1}' | tee ip.txt
      127.0.0.1
      ::1
      192.168.29.55
      fe80::20c:29ff:fec0:5db3
      [root@ccc ~]# cat ip.txt 
      127.0.0.1
      ::1
      192.168.29.55
      fe80::20c:29ff:fec0:5db3
      
    • 重定向与tee的区别

      [root@ccc ~]# date > date.txt			# 直接将内容写入到date.txt文件中
      [root@ccc ~]# date | tee date.txt		# 执行结果输出至屏幕,且保存至文件
      2020年 11月 05日 星期四 18:57:32 CST
      

    12.8 僵尸进程与孤儿进程

    12.8.1 僵尸进程

    • 操作系统负责管理进程,应用程序想开子进程都是在像操作系统发送系统调用。

      当子进程死掉以后,操作系统会将子进程占用的重型资源(如内存空间、cpu资源、打开的文件等)

      Linux的机制会保留子进程的进程号、退出状态、运行时间等供父进程查看

      僵尸进程是Linux系统的一种数据结构,所有子进程结束后都会进入僵尸进程的状态

    • 父进程觉得僵尸进程的数据没用以后,由父进程发起一个系统调用wait/waitpid来通知操作系统清理僵尸进程的残余状态

      # 三种情况:
      # 1、Linux系统自带的优秀的开源软件,在开启子进程时,父进程内部都会及时调用wait/waitpid来通知操作系统回收僵尸进程。因此我们通常看不到优秀开源软件堆积僵尸进程,因为及时回收
      
      # 2、水平良好的程序员开发的应用程序,会在父进程内考虑调用wait/waitpid来通知操作系统回收僵尸进程,但发起系统调用时间可能慢一些,可以用命令看到僵尸进程状态
      [root@ccc ~]# ps aux | grep [z]+
      
      # 3、垃圾程序员不知道僵尸进程是什么,操作系统中就会堆积很多僵尸进程,会导致内存充足、硬盘充足、cpu空闲,但新软件无法启动起来的状况。因为僵尸进程会占用大量的PID
      针对情况三,只有杀死父进程,僵尸进程就会由pid为1的顶级进程(init或systend)接手,顶级进程会定期发起系统调用wait/waitpid来通知操作系统清理僵尸进程。
      针对情况二,可以发送信号给父进程,通知他发起系统调用清理僵尸进程
      kill -CHLD 父进程PID
      

    12.8.2 孤儿进程

    • 父进程先死掉,而他的一个或多个子进程还在运行,这些子进程就会成为孤儿进程。
    • 孤儿进程会被PID为1的顶级进程接手
    • nohup、setsid原理就类似制造孤儿进程
  • 相关阅读:
    EntityFramework 启用迁移 EnableMigrations 报异常 "No context type was found in the assembly"
    JAVA 访问FTP服务器示例(2)
    NuGet Package Manager 更新错误解决办法
    JAVA 访问FTP服务器示例(1)
    RemoteAttribute 的使用问题
    诡异的 javascript 变量
    javascript apply用法
    Babun 中文乱码
    GSM呼叫过程
    转站博客园
  • 原文地址:https://www.cnblogs.com/caojiaxin/p/13933747.html
Copyright © 2011-2022 走看看