linux|Linux运维进程管理

进程管理 进程概述 定义

  • 进程是一个在系统中运行的程序,每个进程都是一个运行的实体,并占用一定的系统资源
  • 程序:二进制文件,是可以实现特定目标或解决特定问题的代码集
  • 进程类型
    • 守护进程:在系统引导过程中启动的进程,跟终端无关的进程
    • 前台进程:跟终端相关,通过终端启动的进程
进程的生命周期
linux|Linux运维进程管理
文章图片

  • 父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的PID,满足跟踪安全性之需。PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代
  • 子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec(执行)自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。当子进程完成时发出(exit)信息请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵尸(zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。
进程状态
在多任务处理操作系统中,每个CPU(或核心)在一个时间点上只能处理一个进程。在进程运行时,它对CPU时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变。
  • R运行状态(runing): 表明进程在运行中,或者在运行队列里,准备运行
  • S可中断睡眠状态(sleeping):意味着进程在等待事件的完成
  • D磁盘睡眠状态(Disk sleep): 也叫不可中断睡眠,在这个状态的进程通常会等待IO的结束
  • 【linux|Linux运维进程管理】T暂停状态(stopped):也叫跟踪状态,可以通过发送SIGSTOP信号,进程响应SIGSTOP信号而进入T暂停状态,这个被暂停的进程可以通过发送SIGCNT信号让进程继续运行。
  • Z僵尸状态(zombie):内核发送SIGCHKD信号通知父进程回收所有的资源
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
特殊进程
僵尸进程:当一个进程fork一个子进程之后,如果子进程退出,而父进程没有利用wait 或者waitpid 来获取子进程的状态信息时就会产生僵尸进程,那么子进程的状态描述符依然保存在系统中,并且会一直等待父进程读取退出状态代码
孤儿进程:当一个父进程fork一个子进程之后,父进程突然被终止了,那么这个子进程就成为了一个孤儿进程,它会被init进程接管
僵尸进程与孤儿进程的区别:
  • 孤儿进程是子进程还在运行,而父进程挂了,子进程被init进程收养。僵尸进程是父进程还在运行但是子进程挂了,但是父进程却没有使用wait来清理子进程的进程信息,导致子进程的状态描述符依然保存在系统中,子进程会一直等待父进程读取退出状态代码。这样长期下去对于系统资源是一个浪费,所以僵尸进程会浪费系统资源
进程管理 查看进程
top动态监测进程
[root@server2 ~]# top

linux|Linux运维进程管理
文章图片

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.0us user:用户模式CPU占比
0.2sy system:系统模式CPU占比
0.0ni nice:改变过优先级的用户进程CPU占比
99.8id idle:空闲CPU占比
0.0wa wait:等待I/O的进程CPU占比
0.0hi 硬中断请求服务的CPU占比
0.0si 软中断请求服务的CPU占比
0.0st steal 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 USERPRNIVIRTRESSHR S%CPU %MEMTIME+COMMAND 1root20012552840082624 S0.00.20:01.13 systemd 2root200000 S0.00.00:00.01 kthreadd 4root0 -20000 S0.00.00:00.00 kworker/0:0H 5root200000 S0.00.00:00.02 kworker/u256:0

字段 说明
PID 进程 ID
USER 进程所属的用户
PR 优先级,数值越小优先级越高
NI NICE优先级,数值越小优先级越高,取值范围-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 totalusedfreesharedbuff/cacheavailable Mem:1863016138672153356897601907761569968 Swap:209714802097148 [root@server1 ~]# free -m totalusedfreesharedbuff/cacheavailable Mem:181913514979186153 Swap:204702047选项说明: -m : 单位为MB,不加该选项默认为KB

df查看磁盘剩余
df = disk free
[root@server1 ~]# df -Th 文件系统类型容量已用可用已用% 挂载点 devtmpfsdevtmpfs899M0899M0% /dev tmpfstmpfs910M0910M0% /dev/shm tmpfstmpfs910M9.6M901M2% /run tmpfstmpfs910M0910M0% /sys/fs/cgroup /dev/mapper/centos-root xfs17G1.9G16G11% / /dev/sda1xfs1014M194M821M20% /boot tmpfstmpfs182M0182M0% /run/user/0选型说明: -h :以较高的可读性显示磁盘剩余空间大小 -T :显示文件系统类型

可以用来查看各分区可用内存的大小
ps查看进程PID
ps不同于top,静态查看进程信息。日常ps命令常用于查询某个进程的PID或PPID或者结合grep获取某个具体进程的信息
[root@server1 ~]# ps -ef UIDPIDPPIDC STIME TTYTIME CMD root100 12:01 ?00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 2 root200 12:01 ?00:00:00 [kthreadd] root420 12:01 ?00:00:00 [kworker/0:0H] root520 12:01 ?00:00:00 [kworker/u256:0] root620 12:01 ?00:00:00 [ksoftirqd/0] root720 12:01 ?00:00:00 [migration/0] root820 12:01 ?00:00:00 [rcu_bh] [root@server1 ~]# ps -ef | grep crond root68410 12:01 ?00:00:00 /usr/sbin/crond -n root11559114880 16:02 pts/000:00:00 grep --color=auto crond #以上信息只有第一行是crond的进程,第二行,是grep命令所启动的进程 [root@server1 ~]# ps -ef |grep crond |grep -v "grep" root68410 12:01 ?00:00:00 /usr/sbin/crond -n [root@server1 ~]# ps -aux #不建议 USERPID %CPU %MEMVSZRSS TTYSTAT STARTTIME COMMAND root10.00.2 1255284008 ?Ss12:010:01 /usr/lib/systemd/systemd --switched-root --system root20.00.000 ?S12:010:00 [kthreadd] root40.00.000 ?S<12:010:00 [kworker/0:0H] root115660.00.1 1554481868 pts/0R+16:130:00 ps -aux [root@server1 ~]# ps aux USERPID %CPU %MEMVSZRSS TTYSTAT STARTTIME COMMAND root10.00.2 1255284008 ?Ss12:010:01 /usr/lib/systemd/systemd --switched-root --syste root20.00.000 ?S12:010:00 [kthreadd] root40.00.000 ?S<12:010: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 TTYTIME CMD 8448 tty100:00:00 su 8449 tty100:00:00 bash 11617 pts/100:00:00 su 11618 pts/100:00:00 bash 11642 pts/000:00:00 ps

字段 说明
UID 用户ID
PID 进程ID
PPID 该进程的父级进程ID,如果找不到,则该进程就被称之为僵尸进程
C/%CPU Cpu的占用率,其形式是百分数
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 AddressForeign AddressStatePID/Program name tcp00 0.0.0.0:220.0.0.0:*LISTEN902/sshd tcp00 127.0.0.1:250.0.0.0:*LISTEN1284/master tcp600 :::22:::*LISTEN902/sshd tcp600 ::1:25:::*LISTEN1284/master [root@server1 ~]# netstat -tnlp | grep ssh tcp00 0.0.0.0:220.0.0.0:*LISTEN902/sshd tcp600 :::22:::*LISTEN902/sshd 选项说明: -t:表示只列出tcp 协议的连接 -u:表示只列出udp 协议的连接 -n:表示将地址从字母组合转化成ip 地址,将协议转化成端口号来显示 -l:只列中LISTEN(监听)的连接 -p:显示进程pid和进程名称

[root@server1 ~]# ss -tnlp StateRecv-Q Send-QLocal Address:PortPeer Address:Port LISTEN0128*:22*:*users:(("sshd",pid=902,fd=3)) LISTEN0100127.0.0.1:25*:*users:(("master",pid=1284,fd=13)) LISTEN0128[::]:22[::]:*users:(("sshd",pid=902,fd=4)) LISTEN0100[::1]:25[::]:*users:(("master",pid=1284,fd=14)) [root@server1 ~]# ss -tnlp | grep ssh LISTEN0128*:22*:*users:(("sshd",pid=902,fd=3)) LISTEN0128[::]:22[::]:*users:(("sshd",pid=902,fd=4))

netstat与ss比较
  • 用法&选项基本相同
  • netstat信息比较简洁,ss更加丰富
  • ss执行效率比netstat略高一些
使用信号控制进程
列出所有支持的信号 [root@server1 ~]# kill -l 1) SIGHUP2) SIGINT3) SIGQUIT4) SIGILL5) SIGTRAP 6) SIGABRT7) SIGBUS8) SIGFPE9) 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

常用信号
编号 信号名 作用
1 SIGHUP 重新加载配置
2 SIGINT 键盘中断^C
3 SIGQUIT 键盘退出
9 SIGKILL 强制终止
15 SIGTERM 终止(正常结束)
18 SIGCONT 继续
19 SIGSTOP 停止
20 SIGTSTP 暂停^Z
kill向进程发射信号 kill/killall结束进程
根据pid发射信号(建议用来结束单个进程) [root@server1 ~]# ps -ef | grep crond | grep -v 'grep' root68410 12:01 ?00:00:00 /usr/sbin/crond -n [root@server1 ~]# kill684#不加选项,默认为-15,终止进程 [root@server1 ~]# ps -ef | grep crond | grep -v 'grep'[root@server1 ~]# ps -ef | grep crond | grep -v 'grep' root1176710 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 up5:23,3 users,load average: 0.03, 0.02, 0.05 USERTTYFROMLOGIN@IDLEJCPUPCPU WHAT roottty112:015:20m0.10s0.00s bash rootpts/0192.168.226.114:525.00s0.08s0.00s w rootpts/1192.168.226.117:2213.00s0.01s0.00s -bash [root@server1 ~]# pkill -t pts/1 [zhangsan@server1 ~]$ Session terminated, killing shell... ...已杀死。[root@server1 ~]# w 17:30:23 up5:28,4 users,load average: 0.00, 0.01, 0.05 USERTTYFROMLOGIN@IDLEJCPUPCPU WHAT roottty112:015:25m0.10s0.00s bash rootpts/0192.168.226.114:527.00s0.08s0.00s w rootpts/1192.168.226.117:2231.00s0.01s0.01s -bash zhangsan pts/2192.168.226.117:305.00s0.00s0.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' root11898114880 17:45 pts/000:00:00 sleep 3000 root11900114880 17:49 pts/000: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 root20025908956756 S0.00.10: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 root15-525908956756 S0.00.10:00.00 atd

renice
获取进程PID [root@server1 ~]# ps -ef |grep atd |grep -v 'grep' root68510 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' root853610 12:36 ?00:00:00 /usr/sbin/crond -n [root@server1 ~]# kill 8536nice调整优先级,并启动程序 [root@server1 ~]# nice -n -10 crond查看 [root@server1 ~]# ps -ef |grep crond root854210 12:38 ?00:00:00 crond [root@server1 ~]# top -p 854 8542 root10 -101263841320716 S0.00.10:00.00 crond

r1 ~]# renice -10 685
685 (进程 ID) 旧优先级为 -5,新优先级为 -10
#### nice> 注意:nice只能调整没有运行的程序```powershell 关闭 [root@server1 ~]# ps -ef |grep crond |grep -v 'grep' root853610 12:36 ?00:00:00 /usr/sbin/crond -n [root@server1 ~]# kill 8536nice调整优先级,并启动程序 [root@server1 ~]# nice -n -10 crond查看 [root@server1 ~]# ps -ef |grep crond root854210 12:38 ?00:00:00 crond [root@server1 ~]# top -p 854 8542 root10 -101263841320716 S0.00.10:00.00 crond

    推荐阅读