Linux运维进程管理

进程管理

进程概述

定义

  • 进程是一个在系统中运行的程序,每个进程都是一个运行的实体,并占用一定的系统资源

  • 程序:二进制文件,是可以实现特定目标或解决特定问题的代码集

  • 进程类型

    • 守护进程:在系统引导过程中启动的进程,跟终端无关的进程

    • 前台进程:跟终端相关,通过终端启动的进程

进程的生命周期

在这里插入图片描述

  • 父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的PID,满足跟踪安全性之需。PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代

  • 子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec(执行)自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。当子进程完成时发出(exit)信息请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵尸(zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。

进程状态

在多任务处理操作系统中,每个CPU(或核心)在一个时间点上只能处理一个进程。在进程运行时,它对CPU时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变。

  • R运行状态(runing): 表明进程在运行中,或者在运行队列里,准备运行

  • S可中断睡眠状态(sleeping):意味着进程在等待事件的完成

  • D磁盘睡眠状态(Disk sleep): 也叫不可中断睡眠,在这个状态的进程通常会等待IO的结束

  • T暂停状态(stopped):也叫跟踪状态,可以通过发送SIGSTOP信号,进程响应SIGSTOP信号而进入T暂停状态,这个被暂停的进程可以通过发送SIGCNT信号让进程继续运行。

  • Z僵尸状态(zombie):内核发送SIGCHKD信号通知父进程回收所有的资源

  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

特殊进程

僵尸进程:当一个进程fork一个子进程之后,如果子进程退出,而父进程没有利用wait 或者waitpid 来获取子进程的状态信息时就会产生僵尸进程,那么子进程的状态描述符依然保存在系统中,并且会一直等待父进程读取退出状态代码

孤儿进程:当一个父进程fork一个子进程之后,父进程突然被终止了,那么这个子进程就成为了一个孤儿进程,它会被init进程接管

僵尸进程与孤儿进程的区别:

  • 孤儿进程是子进程还在运行,而父进程挂了,子进程被init进程收养。僵尸进程是父进程还在运行但是子进程挂了,但是父进程却没有使用wait来清理子进程的进程信息,导致子进程的状态描述符依然保存在系统中,子进程会一直等待父进程读取退出状态代码。这样长期下去对于系统资源是一个浪费,所以僵尸进程会浪费系统资源

进程管理

查看进程

top动态监测进程
[root@server2 ~]# top

在这里插入图片描述

top前五行字段解析
  • 第一行:
top - 08:29:01 up 13:12,  2 users,  load average: 0.00, 0.01, 0.05
内 容说 明
08:29:01系统时间
up 13:12运行时间
2 users登录终端数
load average: 0.00,0.01,0.05系统在之前 1 分钟、5 分钟、15 分钟的平均负载。该值若超过系统CPU核数,则为超负荷运行
  • 获取CPU核数:
[root@server2 ~]# grep 'core id' /proc/cpuinfo | wc -l
2
  • 第二行
Tasks: 108 total,   1 running, 107 sleeping,   0 stopped,   0 zombie
内 容说 明
Tasks: 108 total进程总数
1 running正在运行的进程数
107 sleeping睡眠的进程数
0 stopped停止的进程数
0 zombie僵尸进程数。若非 0,需要手工检查僵尸进程
  • 第三行
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni,99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
内 容说 明
%Cpu(s):CPU占比
0.0ususer:用户模式CPU占比
0.2sysystem:系统模式CPU占比
0.0ninice:改变过优先级的用户进程CPU占比
99.8ididle:空闲CPU占比
0.0wawait:等待I/O的进程CPU占比
0.0hi硬中断请求服务的CPU占比
0.0si软中断请求服务的CPU占比
0.0ststeal time:虚拟时间的CPU占比,虚拟机 CPU 等待实际 CPU 的时间占比

CPU负载测试 => cat /dev/urandom |md5sum

  • 第四行
KiB Mem :  1863028 total,  989344 free,   189552 used,   684132 buff/cache
内 容说 明
KiB Mem物理内存,单位为KB
1863028 total总内存
989344 free空闲的内存
189552 used己经使用的内存
684132 buff/cache作为缓冲的内存
  • 第五行
KiB Swap:  2097148 total,  2097148 free,        0 used.  1569572 avail Mem 
内 容说 明
KiB Swap交换分区,单位为KB
2097148 total交换分区(虚拟内存)的总大小
2097148 free空闲的交换分区
0 used已经使用的交换分区的大小
1569572 avail Mem已被提前加载的内存量

在Linux操作系统分区时,最少需要3个分区:

  • /boot分区 : 系统分区

  • swap交换分区 :一般情况下为内存的1~2倍,但是尽量不要超过2G,当计算机的内存不足时,系统会自动从硬盘中划出一块区域充当内存使用。

  • /分区 :根分区,所有文件都存放于此

进程详细信息字段解析
PID USER   PR  NI    VIRT   RES   SHR S  %CPU %MEM   TIME+  COMMAND                                      
 1  root   20   0  125528  4008  2624 S   0.0  0.2   0:01.13 systemd                                      
 2  root   20   0       0     0     0 S   0.0  0.0   0:00.01 kthreadd                                     
 4  root    0 -20       0     0     0 S   0.0  0.0   0:00.00 kworker/0:0H                                 
 5  root   20   0       0     0     0 S   0.0  0.0   0:00.02 kworker/u256:0
字段说明
PID进程 ID
USER进程所属的用户
PR优先级,数值越小优先级越高
NINICE优先级,数值越小优先级越高,取值范围-20到19,默认都是0
VIRT虚拟内存大小,单位KB
RES物理内存大小,单位KB
SHR共享内存大小,单位KB
S进程状态
%CPU该进程占用 CPU 的百分比
%MEM该进程占用内存的百分比
TIME+该进程共占用的 CPU 时间
COMMAND进程名
常用快捷键
按键作用
M按内存的使用排序
P按CPU使用排序
N以PID的大小排序
R对排序进行反转
1显示所有CPU的负载
z彩色
q退出
free查看内存
[root@server1 ~]# free
          total       used      free      shared  buff/cache   available
Mem:      1863016     138672    1533568   9760    190776       1569968
Swap:     2097148          0    2097148
[root@server1 ~]# free -m
          total       used      free      shared  buff/cache   available
Mem:      1819        135       1497       9      186          153
Swap:     2047          0       2047

选项说明:
-m : 单位为MB,不加该选项默认为KB
df查看磁盘剩余

df = disk free

[root@server1 ~]# df -Th 
文件系统                 类型       容量   已用   可用   已用% 挂载点
devtmpfs                devtmpfs  899M     0  899M    0% /dev
tmpfs                   tmpfs     910M     0  910M    0% /dev/shm
tmpfs                   tmpfs     910M  9.6M  901M    2% /run
tmpfs                   tmpfs     910M     0  910M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        17G  1.9G   16G   11% /
/dev/sda1               xfs      1014M  194M  821M   20% /boot
tmpfs                   tmpfs     182M     0  182M    0% /run/user/0

选型说明:
-h :以较高的可读性显示磁盘剩余空间大小
-T :显示文件系统类型

可以用来查看各分区可用内存的大小

ps查看进程PID

ps不同于top,静态查看进程信息。日常ps命令常用于查询某个进程的PID或PPID或者结合grep获取某个具体进程的信息

[root@server1 ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 12:01 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 2
root          2      0  0 12:01 ?        00:00:00 [kthreadd]
root          4      2  0 12:01 ?        00:00:00 [kworker/0:0H]
root          5      2  0 12:01 ?        00:00:00 [kworker/u256:0]
root          6      2  0 12:01 ?        00:00:00 [ksoftirqd/0]
root          7      2  0 12:01 ?        00:00:00 [migration/0]
root          8      2  0 12:01 ?        00:00:00 [rcu_bh]
[root@server1 ~]# ps -ef | grep crond
root        684      1  0 12:01 ?        00:00:00 /usr/sbin/crond -n
root      11559  11488  0 16:02 pts/0    00:00:00 grep --color=auto crond
#以上信息只有第一行是crond的进程,第二行,是grep命令所启动的进程
[root@server1 ~]# ps -ef |grep crond |grep -v "grep"
root        684      1  0 12:01 ?        00:00:00 /usr/sbin/crond -n
[root@server1 ~]# ps -aux #不建议
USER    PID %CPU %MEM   VSZ   RSS TTY   STAT START   TIME COMMAND
root      1  0.0  0.2 125528  4008 ?     Ss   12:01  0:01 /usr/lib/systemd/systemd --switched-root --system
root      2  0.0  0.0      0     0 ?     S    12:01  0:00 [kthreadd]
root      4  0.0  0.0      0     0 ?     S<   12:01  0:00 [kworker/0:0H]
root      11566  0.0  0.1 155448  1868 pts/0    R+   16:13   0:00 ps -aux
[root@server1 ~]# ps aux
USER    PID %CPU %MEM    VSZ   RSS TTY   STAT START  TIME COMMAND
root      1  0.0  0.2 125528  4008 ?     Ss   12:01  0:01 /usr/lib/systemd/systemd --switched-root --syste
root      2  0.0  0.0      0     0 ?     S    12:01  0:00 [kthreadd]
root      4  0.0  0.0      0     0 ?     S<   12:01  0:00 [kworker/0:0H]
选项说明:
-e : 列出全部进程
-f : full,显示全字段
-ef: 显示全部进程
-u : 以用户为中心组织进程状态信息显示 
-a : 与终端相关的进程
-x : 与终端无关的进程
aux: 显示全部进程
#“ps -aux”不同于“ps aux”,POSIX和UNIX标准要求“ps -aux”打印名为“x”的用户拥有的所有进程,如果名为“x”的用户不存在,此时ps会将该命令解释为“ps aux”
[root@server1 ~]# useradd x
[root@server1 ~]# ps -aux
   PID TTY          TIME CMD
  8448 tty1     00:00:00 su
  8449 tty1     00:00:00 bash
 11617 pts/1    00:00:00 su
 11618 pts/1    00:00:00 bash
 11642 pts/0    00:00:00 ps
字段说明
UID用户ID
PID进程ID
PPID该进程的父级进程ID,如果找不到,则该进程就被称之为僵尸进程
C/%CPUCpu的占用率,其形式是百分数
STIME进程的启动时间
TTY终端设备,显示“?”则表示该进程并不是由终端设备发起
TIME进程实际使用CPU的时间
CMD该进程的名称或者对应的路径
USER用户
%MEM内存的占用率
VSZ进程占用的虚拟内存
RSS进程占用的固定的内存
STAT进程目前的状态
netstat/ss查询进程端口号
[root@server1 ~]# netstat -tnlp
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      902/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1284/master         
tcp6       0      0 :::22                   :::*                    LISTEN      902/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1284/master
[root@server1 ~]# netstat -tnlp | grep ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      902/sshd            
tcp6       0      0 :::22                   :::*                    LISTEN      902/sshd 
选项说明:
-t:表示只列出tcp 协议的连接
-u:表示只列出udp 协议的连接
-n:表示将地址从字母组合转化成ip 地址,将协议转化成端口号来显示
-l:只列中LISTEN(监听)的连接
-p:显示进程pid和进程名称
[root@server1 ~]# ss -tnlp
State      Recv-Q Send-Q            Local Address:Port                           Peer Address:Port              
LISTEN     0      128                           *:22                                        *:*                   users:(("sshd",pid=902,fd=3))
LISTEN     0      100                   127.0.0.1:25                                        *:*                   users:(("master",pid=1284,fd=13))
LISTEN     0      128                        [::]:22                                     [::]:*                   users:(("sshd",pid=902,fd=4))
LISTEN     0      100                       [::1]:25                                     [::]:*                   users:(("master",pid=1284,fd=14))
[root@server1 ~]# ss -tnlp | grep ssh
LISTEN     0      128          *:22                       *:*                   users:(("sshd",pid=902,fd=3))
LISTEN     0      128       [::]:22                    [::]:*                   users:(("sshd",pid=902,fd=4))

netstat与ss比较

  • 用法&选项基本相同

  • netstat信息比较简洁,ss更加丰富

  • ss执行效率比netstat略高一些

使用信号控制进程

列出所有支持的信号
[root@server1 ~]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

常用信号

编号信号名作用
1SIGHUP重新加载配置
2SIGINT键盘中断^C
3SIGQUIT键盘退出
9SIGKILL强制终止
15SIGTERM终止(正常结束)
18SIGCONT继续
19SIGSTOP停止
20SIGTSTP暂停^Z
kill向进程发射信号
kill/killall结束进程
根据pid发射信号(建议用来结束单个进程)
[root@server1 ~]# ps -ef | grep crond | grep -v 'grep'
root        684      1  0 12:01 ?        00:00:00 /usr/sbin/crond -n
[root@server1 ~]# kill  684  #不加选项,默认为-15,终止进程
[root@server1 ~]# ps -ef | grep crond | grep -v 'grep'

[root@server1 ~]# ps -ef | grep crond | grep -v 'grep'
root      11767      1  0 17:13 ?        00:00:00 /usr/sbin/crond -n
[root@server1 ~]# kill -9 11767 #-9强制终止进程
[root@server1 ~]# ps -ef | grep crond | grep -v 'grep'


根据进程名结束进程(可一次结束多个进程,包括父进程fork出的子进程)
[root@server1 ~]# systemctl restart crond.service 
[root@server1 ~]# killall crond
[root@server1 ~]# ps -ef | grep crond | grep -v 'grep'
pkill踢出远程登录用户
[root@server1 ~]# w
 17:24:29 up  5:23,  3 users,  load average: 0.03, 0.02, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      12:01    5:20m  0.10s  0.00s bash
root     pts/0    192.168.226.1    14:52    5.00s  0.08s  0.00s w
root     pts/1    192.168.226.1    17:22   13.00s  0.01s  0.00s -bash
[root@server1 ~]# pkill -t pts/1
[zhangsan@server1 ~]$ 
Session terminated, killing shell... ...已杀死。

[root@server1 ~]# w
 17:30:23 up  5:28,  4 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      12:01    5:25m  0.10s  0.00s bash
root     pts/0    192.168.226.1    14:52    7.00s  0.08s  0.00s w
root     pts/1    192.168.226.1    17:22   31.00s  0.01s  0.01s -bash
zhangsan pts/2    192.168.226.1    17:30    5.00s  0.00s  0.00s -bash
[root@server1 ~]# pkill -u zhangsan
[zhangsan@server1 ~]$ Connection closing...Socket close.
Connection closed by foreign host.
Disconnected from remote host(192.168.226.10:22) at 23:02:56.
Type `help' to learn how to use Xshell prompt.
[D:\~]$ 

选项说明:
-t:指定踢出终端
-u:指定踢出终端上登录的用户

作业控制

  • 作业控制是一个命令行功能,允许一个shell实例来运行和管理多个命令。

  • 如果没有作业控制,父进程fork()一个子进程后,将sleeping,直到子进程退出使用作业控制,可以选择性暂停,恢复,以及异步运行命令,让shell可以在子进程运行期间返回接受其他命令

  • 作用:

    • 将任务进行前台后台的切换
    • 可以控制进程运行或者停止
  • 前台:foreground ,前台进程是在终端中运行的命令,该终端为进程的 控制终端 。前台进程接受键盘产生的输入和信号,并允许从终端读取或写入到终端。

  • 后台:background ,后台进程没有控制终端 ,它不需要终端的交互。

sleep:用于延迟shell脚本的时间,默认单位为s
------------------------------------------------
 & 将程序放到后台执行
[root@server1 ~]# sleep 3000 &
[1] 11898

^Z,将前台的程序挂起(暂停)到后台
[root@server1 ~]# sleep 2000
^Z
[2]+  已停止               sleep 2000
[root@server1 ~]# ps -ef | grep sleep | grep -v 'grep'
root      11898  11488  0 17:45 pts/0    00:00:00 sleep 3000
root      11900  11488  0 17:49 pts/0    00:00:00 sleep 2000

查看后台作业
[root@server1 ~]# jobs
[1]-  运行中               sleep 3000 &
[2]+  已停止               sleep 2000

让后台停止的作业在后台运行
[root@server1 ~]# bg %2
[2]+ sleep 2000 &
[root@server1 ~]# jobs
[1]-  运行中               sleep 3000 &
[2]+  运行中               sleep 2000 &

将后台作业调回前台
[root@server1 ~]# fg %1
sleep 3000

终止前台作业^C

进程的优先级

概述

每个CPU(或CPU核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程(和线程数)可以超出实际可用的CPU及核心数量。Linux内核进程调度程序将多个进程在CPU核心上快速切换,从而给用户多个进程在同时运行的假象。

由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的的调度策略为SCHED_OTHER(也称为SCHED_NORMAL),SCHED_OTHER调度策略运行的进程的相对优先级称为进程的nice值

nice值

Nice值:-20~+19

NI 优先级,数值越小优先级越高,可以人为更改。(NI = NICE = Nice)

PR 优先级,将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39

调整进程的优先级

top交互
获取进程PID
[root@server1 ~]# top -bn 1  #静态一屏获取所有进程信息
 685 root      20   0   25908    956    756 S   0.0  0.1   0:00.00 atd

交互修改
[root@server1 ~]# top
r-->685-->-5-->q
PID to renice [default pid = 1] 685
Renice PID 685 to value -5

查看
[root@server1 ~]# top -p 685 #只查看pid=685的进程的信息
  685 root      15  -5   25908    956    756 S   0.0  0.1   0:00.00 atd 
renice
获取进程PID
[root@server1 ~]# ps -ef |grep atd |grep -v 'grep'
root        685      1  0 12:01 ?        00:00:00 /usr/sbin/atd -f

调整NICE值
[root@server1 ~]# renice -10 685
685 (进程 ID) 旧优先级为 -5,新优先级为 -10
nice

注意:nice只能调整没有运行的程序

关闭
[root@server1 ~]# ps -ef |grep crond |grep -v 'grep'
root       8536      1  0 12:36 ?        00:00:00 /usr/sbin/crond -n
[root@server1 ~]# kill 8536

nice调整优先级,并启动程序
[root@server1 ~]# nice -n -10 crond

查看
[root@server1 ~]# ps -ef |grep crond
root       8542      1  0 12:38 ?        00:00:00 crond
[root@server1 ~]# top -p 854
 8542 root      10 -10  126384   1320    716 S   0.0  0.1   0:00.00 crond 

r1 ~]# renice -10 685
685 (进程 ID) 旧优先级为 -5,新优先级为 -10


#### nice

> 注意:nice只能调整没有运行的程序

```powershell
关闭
[root@server1 ~]# ps -ef |grep crond |grep -v 'grep'
root       8536      1  0 12:36 ?        00:00:00 /usr/sbin/crond -n
[root@server1 ~]# kill 8536

nice调整优先级,并启动程序
[root@server1 ~]# nice -n -10 crond

查看
[root@server1 ~]# ps -ef |grep crond
root       8542      1  0 12:38 ?        00:00:00 crond
[root@server1 ~]# top -p 854
 8542 root      10 -10  126384   1320    716 S   0.0  0.1   0:00.00 crond 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值