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
文章图片
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 | 退出 |
[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 | 进程目前的状态 |
[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 |
根据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
推荐阅读
- Linux下面如何查看tomcat已经使用多少线程
- Beego打包部署到Linux
- Linux|109 个实用 shell 脚本
- linux定时任务contab
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- day16-Linux|day16-Linux 软件管理
- 如何在阿里云linux上部署java项目
- mac|mac 链接linux服务器 如何在Mac上连接服务器
- Linux|Linux 服务器nginx相关命令
- linux笔记|linux 常用命令汇总(面向面试)