Linux系统管理实战-进程管理

发布时间 2023-08-09 17:05:54作者: Boldcc

进程管理


  • 了解进程 状态/生命周期
  • 查看进程
  • 管理进程 kill killall pkill
  • 进程的调度
  • 进程的nice

了解进程状态/生命周期

什么是进程?

process

进程的状态?

process_state

进程的生命周期?

process_cycle

查看进程

[bavduer@system_manager ~]$ sudo yum -y install psmisc htop atop net-tools

##查看特定进程的信息,静态 <top可以动态查看进程的信息>
[bavduer@system_manager ~]$ sudo ps aux | grep sshd		---(10000?)查看指定进程的静态信息
USER      PID    %CPU %MEM VSZ    RSS  TTY      STAT START   TIME COMMAND
root      6775   0.0  0.4 112756  4320 ?        Ss   11:13   0:00 /usr/sbin/sshd -D
root      18950  0.0  0.6 161360  6144 ?        Ss   17:12   0:00 sshd: bavduer [priv]
bavduer   18952  0.0  0.2 161360  2348 ?        S    17:12   0:00 sshd: bavduer@pts/0
bavduer   19057  0.0  0.0 112724  988  pts/0    S+   18:09   0:00 grep --color=auto sshd

aux:
	-ax: 显示所有进程的pid、tty、cmd、cpu占用总时间
	-u:  显示用户列表中的所有硬件使用信息

grep: 可以用来过滤特定字符或特定程序名 grep "string字符串"


        USER: 	运行进程的用户
        PID:	子进程ID -- ppid父进程ID
        %CPU:	CPU占用率 
        %MEM:	内存占用率memory
        VSZ:	占用虚拟内存 
        RSS:  	占用实际内存 驻留内存
        TTY: 	进程运行的终端 
        STAT:	进程状态
        man ps (/STATE)			     

          R 	运行
          S 	可中断睡眠 Sleep  
          D		不可中断睡眠 (usually IO)       
          T		停止的进程/暂停⏸️      
          Z		僵尸进程      
          X		死掉的进程【了解 】 	
          Ss	s进程的领导者,父进程 	  
          S<	优先级较高的进程 	
          SN	N优先级较低的进程 	 
          R+	+表示是前台的进程组 	
          Sl	以线程的方式运行	

        START:		进程启动时的时间
        TIME:		进程占用CPU的总时间
        COMMAND:	进程文件,进程名 

[bavduer@system_manager ~]$ sudo ss -anptu | grep sshd					(10000?)
Netid  State    Recv-Q  Send-Q Local Address:Port  Peer Address:Port 
tcp    LISTEN   0       128    *:22                *:*  users:(("sshd",pid=6775,fd=3))
tcp    LISTEN   0       128    :::22               :::* users:(("sshd",pid=6775,fd=4))

        Netid: 网络连接协议
        State: 监听状态
        Recv-Q: 网络接收队列
        Send-Q: 网络发送队列
        Local Address:Port: 本地地址:端口号
        Peer Address:Port: 远端地址:端口号


[bavduer@system_manager ~]$ sudo netstat -anptu | grep sshd				(10000?)
Proto  Recv-Q Send-Q Local Address    Foreign Address       State
tcp        0    0 0.0.0.0:22          0.0.0.0:*             LISTEN      6775/sshd
tcp        0    0 192.168.161.100:22  192.168.161.1:53983   ESTABLISHED 18950/sshd: bavduer
tcp6       0    0 :::22               :::*                  LISTEN      6775/sshd
Recv-Q Send-Q分别表示网络接收队列、发送队列. Q是Queue的缩写.
这两个值通常应该为0,如果不为0可能是有问题的

##pstree查看进程树
[bavduer@system_manager ~]$ sudo pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─agetty
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───6*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        └─tuned───4*[{tuned}]
        
[bavduer@system_manager ~]$ sudo pstree -p
systemd(1)─┬─NetworkManager(5987)─┬─{NetworkManager}(6117)
           │                      └─{NetworkManager}(6151)
           ├─agetty(6040)
           ├─auditd(5320)───{auditd}(5327)
           ├─crond(6000)
           ├─dbus-daemon(5924)
           ├─lvmetad(3135)
           ├─master(6954)─┬─pickup(19038)
           │              └─qmgr(6960)
           ├─polkitd(5897)─┬─{polkitd}(5979)
           │               ├─{polkitd}(5994)
           │               ├─{polkitd}(5999)
           │               ├─{polkitd}(6010)
           │               ├─{polkitd}(6013)
           │               └─{polkitd}(6033)
           ├─rsyslogd(6776)─┬─{rsyslogd}(6808)
           │                └─{rsyslogd}(6811)
           ├─sshd(6775)───sshd(18950)───sshd(18952)───bash(18953)───pstree(19265)
           ├─systemd-journal(3115)
           ├─systemd-logind(5916)
           ├─systemd-udevd(3139)
           └─tuned(6777)─┬─{tuned}(7060)
                         ├─{tuned}(7061)
                         ├─{tuned}(7062)
                         └─{tuned}(7076)
                         
                         
##pgrep查看特定进程的pid号, 常常与kill联合使用, 杀死问题进程
    -l 同时显示进程名和PID
    -o 当匹配多个进程时,显示进程号最小的那个
    -n 当匹配多个进程时,显示进程号最大的那个
[bavduer@system_manager ~]$ sudo pgrep sshd		--服务名或者命令名
6775
18950
18952
[bavduer@system_manager ~]$ sudo pgrep -l sshd
6775 sshdtingnfjangj
18950 sshd
18952 sshd
[bavduer@system_manager ~]$ sudo pgrep -o sshd			---显示最高的父进程
6775
[bavduer@system_manager ~]$ sudo pgrep -n sshd			---显示最低的子进程
18952![nethogs](img/nethogs_state.png)

top动态查看进程信息

top

  • buffers: 块设备数据缓冲,记录文件系统metadata(目录\权限\属性)
  • cached: 文件内容的缓冲
  • us: 用户使用CPU的百分比
  • sy:内核使用CPU的百分比
  • ni: 用户进程空间内改变过优先级的进程占用CPU的百分比
  • id: 空闲CPU百分比
  • wa: 等待输入输出的CPU时间百分比
  • hi: 硬件中断
  • si: 软件中断
  • st: CPU实时

htop动态查看进程信息

htop

进程管理kill、killall、pkill

sig

 1) SIGHUP		重新加载配置
 2) SIGINT		键盘中断 ^C 
 3) SIGQUIT		键盘退出
 9) SIGKILL		强制终止
 15) SIGTERM	终止(正常结束),缺省信号
 18) SIGCONT	继续 
 19) SIGSTOP	停止
 20) SIGTSTP	暂停^Z
A. kill案例1: 杀死vim进程<****** 9信号15信号>
[root@system_manager ~]# ps aux | grep vim
root       5594  0.1  0.2 151492  5120 pts/0    S+   11:37   0:00 vim /root/b.txt
root       5609  0.0  0.0 112720   984 pts/1    S+   11:37   0:00 grep --color=auto vim
[root@system_manager ~]# kill 5594
[root@system_manager ~]# ps aux | grep vim
root       5657  0.0  0.0 112720   984 pts/1    S+   11:38   0:00 grep --color=auto vim

B. kill案例2: 杀死远程sshd连接
[root@system_manager ~]# ps aux | grep sshd
root       1162  0.0  0.2 112796  4296 ?        Ss   10:59   0:00 /usr/sbin/sshd -D
root       3665  0.0  0.2 160884  5716 ?        Ss   11:01   0:00 sshd: root@pts/1
root       5764  0.0  0.0 112708   972 pts/0    S+   11:40   0:00 grep --color=auto sshd
[root@system_manager ~]# kill -9 1162
[root@system_manager ~]# ps aux | grep sshd
root       3665  0.0  0.2 160884  5716 ?        Ss   11:01   0:00 sshd: root@pts/1
root       5795  0.0  0.0 112708   972 pts/0    S+   11:40   0:00 grep --color=auto sshd
[root@system_manager ~]# kill -9 3665

c.killall案例:
[root@system_manager ~]# ps aux | grep vim
root       6000  0.0  0.2 151568  5232 pts/0    S+   11:43   0:00 vim file1.txt
root       6052  0.0  0.2 151564  5224 pts/1    S+   11:44   0:00 vim file2.txt
root       6281  0.0  0.0 112720   980 pts/3    S+   11:46   0:00 grep --color=auto vim
[root@system_manager ~]# killall vim
[root@system_manager ~]# ps aux | grep vim
root       6313  0.0  0.0 112720   980 pts/3    S+   11:46   0:00 grep --color=auto vim


d.pkill案例:
[root@system_manager ~]# w
 17:29:06 up 21 min,  4 users,  load average: 0.00, 0.03, 0.10
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     :0       :0               107月18 ?xdm?  28.49s  0.26s /usr/libexec/gnome-session-binary --sessio
root     pts/0    10.18.41.54      17:18    1:54   0.04s  0.04s -bash
root     pts/1    10.18.41.54      17:10    1:46   0.06s  0.06s -bash
root     pts/2    10.18.41.54      17:11    2.00s  0.12s  0.01s w
[root@system_manager ~]# pkill -9 -t pts/0
[root@system_manager ~]# w
 17:29:35 up 22 min,  3 users,  load average: 0.00, 0.03, 0.10
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     :0       :0               107月18 ?xdm?  28.43s  0.26s /usr/libexec/gnome-session-binary --sessio
root     pts/1    10.18.41.54      17:10    2:15   0.06s  0.06s -bash
root     pts/2    10.18.41.54      17:11    7.00s  0.13s  0.02s w

进程前后台调度

1、前台运行:    
        # firefox 192.168.1.250
       会发现该程序一直占用终端,其他命令不能够再在这个终端运行
2、后台运行
    1)命令执行的时候,直接将其放置于后台运行
        # firefox 192.168.1.250  &
            [1] 6222
         后台运行不会占用执行命令的终端,用户仍然可以使用这个终端做操作
    2)对于一个已经运行的命令,如何将其放置于后台 ctrl+z
        # firefox 192.168.1.250
        [1]   Done                    firefox 192.168.1.250    
        [2]+  Stopped                 firefox 192.168.1.250
        ctrl+z将前台进程放置于后台,但是该进程在后台是停止的状态
        # jobs     //查看后台进程运行状态
            [2]+  Stopped                 firefox 192.168.1.250
        # bg 2     //激活后台进程
            [2]+ firefox 192.168.1.250 &
        # jobs
            [2]+  Running                 firefox 192.168.1.250 &

     bg 任务编号  : 指定任务在后台运行
     fg 任务编号   : 将后台运行的命令变成前台运行
            # fg 2
                firefox 192.168.1.250

注意:不管你是前台运行,还是后台运行,只要终端一关闭,进程就停止了。
那么如何让一个命令或者程序脱离终端?
    使用nohup命令。
    # nohup firefox 192.168.1.250 &
        [1] 6537
    # nohup: ignoring input and appending output to `nohup.out' //按回车

进程的nice值

谦让值:nice 
    作用:指定或者调整用户进程的nice值
            nice值越高,该进程抢占资源的能力越弱
            nice值越低,该进程抢占资源的能力越强
       范围:-20~19

相关命令
    nice  -- 运行时直接设置nice值
        用法: nice -n 数字 command
        
    renice  -- 对于已经运行的,调整nice值
        用法: renice 数字 PID