Linux进程管理ps
进程概念
进程(Process)是计算机中已运行程序的实体,是程序的一个具体实现。当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用。进程除包含程序的静态代码(text),还包含堆(heap)、栈(stack)、数据(data)段,堆用来在进程正在运行时分配所需的内存,栈用来保存临时数据(如函数参数、返回地址、局部变量),数据段用来保存已初始化的变量。
常见的5种进程状态
- R(运行)(TASK_RUNNING):
● 正在运行或在运行队列中等待。 - S(中断)(TASK_INTERRUPTIBLE):
● 休眠中, 受阻, 在等待某个条件的形成或接受到信号。 - D(不可中断)(TASK_UNINTERRUPTIBLE) :
● 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。 - Z(僵死) (TASK_ZOMBIE):
● 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。 - T(停止)(TASK_STOPED):
● 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。
进程状态变化
:
进程常用命令
https://blog.51cto.com/c959c/5331522
进程管理的作用:
- 判断服务器健康状态
- 查看系统中所有进程
- 杀死进程
- pstree
- top
- pidof
- nice
- killall
ps查看进程
https://www.linuxcool.com/ps
https://wangchujiang.com/linux-command/c/ps.html
ps命令: ps命令是最基本又非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等,大部分进程信息都是可以通过执行该命令得到的。例如显示系统中终端上的所有进行进程。
选项 | 描述 |
---|---|
-e | 显示所有进程,而不仅仅是当前用户的进程 |
-f | 显示完整的进程信息,包括进程的命令行参数 |
-L | 显示每个线程的详细信息 |
-h | 不显示标题 |
-l | 使用长格式 |
-w | 宽行输出 |
-a | 显示终端上的所有进程,包括其他用户的进程 |
-r | 只显示正在运行的进程 |
-x | 显示没有控制终端的进程 |
查看安全信息
参数 -e
显示所有进程信息,-o
参数控制输出。Pid
,User
和 Args
参数显示PID
,运行应用的用户
和该应用。
## -e 显示所有进程信息
## -o 参数控制输出
ps -eo pid,user,args
ps查看所有进程
# -a 显示所有用户进程
ps -a
## -A 显示所有用户的进程;
## -f 进程名、完整格式的命令行参数等;
## -H 显示进程树结构,以展示父进程与子进程之间的关系。
ps -AfH
# 以Linux查看系统中所有进程名(只显示进程名)
## -A 显示所有程序
ps -A
## -e:此选项的效果和指定"A"选项相同。
### e:列出程序时,显示每个程序所使用的环境变量。
ps -e
BSD风格打印
# BSD风格打印查看系统中所有进程
## -a 所有用户
## -u 以用户为主的格式来显示程序状况
## -x 显示所有程序(带程序路径)
ps aux
ps常用查看命令按内存或CPU排序
# 以内存占用排序
ps -eo pid,ppid,cmd,%mem,%cpu --sort=%mem | head
# 以CPU占用排序
ps -eo pid,ppid,cmd,%mem,%cpu --sort=%cpu | head
# 动态查看
watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=%mem |head'
完整格式
# 完整格式
ps -ef
ps常见问题
ps命令使用中出现的一些常见问题
调整进程优先级
https://blog.csdn.net/omaidb/article/details/118720971
ps -aux显示不全被截断
PS命令默认显示的命令长度只有80字符,后面的字符会被截断.
# 不使用-
ps aux
# -ww 禁止截断
ps -auxww
查看僵尸进程
# 查看僵尸进程
## stat 进程的状态
## lstart 命令开始的时间
## etime 启动了多长时间
ps -A -o stat,ppid,pid,lstart,etime,cmd | egrep "^[Z z]"
# 查看僵尸进程产生的时间
ps -eo pid,lstart,etime,cmd|grep anacron
查看进程目录
Linux
的进程
保存在/proc/
;
查看/proc
目录,发现目录下很多以数字开头的目录
,
这个数字目录
就是 进程号
;里面就是进程的内容;
cd /proc/
进程号,每个进程号都会生成一个目录,fb目录下是当前进程的活动
/proc
目录下的数字,就是进程号
# 查看进程目录
ls /proc/
pstree查看进程树
# 先要安装psmisc
yum install psmisc -y
# 查看进程树
pstree
top查看动态进程
# 查看动态进程
top
## -c 提供完整的进程路径及名称
## -d 5 设定每隔5秒刷新一次信息
top -cd5
# 查看线程ID
## top默认只能查看进程ID,—H查看线程ID
top -H
按cpu排序
top -c
按住shift键+p
按内存排序
top -c
按住shift键+m
top查看指定pid
## -c 提供完整的进程路径及名称
## -d 5 设定每隔5秒刷新一次信息
## -p pid 查看指定pid的资源占用
top -cd 5 -p ${pid}
htop
# 安装epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 安装htop
yum install htop -y
# 查看
htop
glances
# 安装glances
pip3 install glances
# 执行glances
glances
kill操作进程
下面是常用
的信号。
只有第9
种信号(SIGKILL)才可以无条件终止进程,其他信号
进程都有权忽略
。
编号 | 信号名 | 含义 |
---|---|---|
0 | EXIT | 程序退出时收到该信息。 |
1 | HUP | 终端挂断 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
2 | INT | 中断(同 Ctrl + C) 表示结束进程,但并不是强制性的,常用的 “Ctrl+C” 组合键发出就是一个 kill -2 的信号。 |
3 | QUIT | 退出(同 Ctrl + \) |
9 | KILL | 强制终止 杀死进程,即强制结束进程。 |
11 | SEGV | 段错误。 |
15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
18 | CONT | 继续(与STOP相反,fg/bg命令) |
19 | STOP | 暂停(同 Ctrl + Z) |
kill列出信号名称
https://wangchujiang.com/linux-command/c/kill.html
# 查看可:
kill -l
编号 | 解释 | |
---|---|---|
1 ) | SIGHUP | 终端挂断; 挂起信号,通常用于重新加载配置文件。当进程接收到 SIGHUP 时,它会重新读取配置文件,以便更新其行为。 |
2 ) | SIGINT | 中断信号,通常由终端用户通过键盘输入 CTRL+C 生成。它用于中断正在运行的进程。 |
3 ) | SIGQUIT | 退出信号。退出(同 Ctrl + \\ );类似于 SIGINT,但生成的堆栈跟踪信息更详细。它通常用于指示进程退出,并生成调试信息。 |
4) | SIGILL | 非法指令信号。当进程尝试执行非法、损坏或不支持的指令时,会收到此信号。 |
5) | SIGTRAP | 跟踪陷阱信号。通常由调试器用于实现断点和跟踪功能。 |
6) | SIGABRT | 中止信号。通常由进程自身调用 abort() 函数生成,用于指示发生严重错误并终止进程。 |
7) | SIGBUS | 总线错误信号。当进程访问无效的内存地址或发生与总线操作相关的错误时,会收到此信号。 |
8) | SIGFPE | 浮点异常信号。当进程执行浮点运算时发生错误,如除以零或浮点溢出,会收到此信号。 |
9 ) | SIGKILL | 强制终止 信号,会立即终止进程,不允许进行清理操作或资源释放。它是无法被进程捕获或忽略的信号。 |
10) | SIGUSR1 | 用户定义的信号1。可以由进程自定义使用 |
11) | SIGSEGV | 段错误信号。当进程访问无效的内存区域或发生内存保护违规时,会收到此信号 |
12) | SIGUSR2 | 用户定义的信号2。可以由进程自定义使用 |
13) | SIGPIPE | 管道破裂信号。当进程向一个已经关闭的管道写入数据时,会收到此信号 |
14) | SIGALRM | 定时器超时信号。由定时器设定的时间到期时,会收到此信号 |
15 ) | SIGTERM | 默认信号,用于请求进程正常终止 。进程可以捕获此信号并执行清理操作后终止。 |
16) | SIGSTKFLT | 协处理器栈错误信号。当协处理器栈发生错误时,会收到此信号 |
17) | SIGCHLD | 子进程状态变化信号。父进程在子进程终止或停止时会收到此信号 |
18 ) | SIGCONT | 继续信号,用于恢复被停止的进程的执行。 继续(与 STOP 相反,fg/bg命令) |
19 ) | SIGSTOP | 暂停(同 Ctrl + Z );停止信号,用于暂停进程的执行。与 SIGKILL 不同,SIGSTOP 允许进程在后续恢复。 |
20) | SIGTSTP | 终端挂起信号。通常由终端用户通过键盘输入 CTRL+Z 生成。用于暂停正在运行的进程 |
21) | SIGTTIN | 后台读取信号。当后台进程尝试从终端读取时,会收到此信号 |
22) | SIGTTOU | 后台写入信号。当后台进程尝试向终端写入时,会收到此信号 |
23) | SIGURG | 紧急情况信号。用于指示套接字上发生紧急情况 |
24) | SIGXCPU | CPU 时间超时信号。当进程的 CPU 时间超过限制时,会收到此信号 |
25) | SIGXFSZ | 文件大小超过限制信号。当进程尝试创建或写入文件超过大小限制时,会收到此信号 |
26) | SIGVTALRM | 虚拟定时器超时信号。由虚拟定时器设定的时间到期时,会收到此信号 |
27) | SIGPROF | 分析器定时器超时信号。由分析器定时器设定的时间到期时,会收到此信号 |
28) | SIGWINCH | 窗口大小改变信号。当终端窗口大小发生变化时,会收到此信号 |
29) | SIGIO | I/O 可用信号。用于指示关联的 I/O 设备上有数据可读取或写入 |
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 | 实时信号的最大编号 |
kill暂停进程和继续进程
# 暂停进程
kill -s SIGSTOP pid
# 或
kill -STOP pid
# 继续进程
kill -s SIGCONT pid
kill -CONT pid
kill重启进程
# 重启进程:
kill -1 PID
kill根据pid杀死进程
# kill根据pid杀死进程
kill pid
# 强制杀死进程:
kill -9 PID
killall
根据进程名杀死一组进程
https://www.runoob.com/linux/linux-comm-killall.html
# 安装killall命令
yum install psmisc -y
# 结束指定进程名
killall 进程名
# 实例: 结束所有bash
killlall -9 bash
pgrep根据名字查pid
参考: https://www.linuxcool.com/pgrep
https://wangchujiang.com/linux-command/c/pgrep.html
参数 | 解释 |
---|---|
-o | 仅显示找到的最小(起始)进程号; |
-n | 仅显示找到的最大(结束)进程号; |
-l | 显示进程名称; |
-P | 指定父进程号; |
-g | 指定进程组; |
-t | 指定开启进程的终端; |
-u | 指定进程的有效用户ID; |
-x | 与命令名称完全匹配。 |
# 显示进程名和最小的pid
## -l:显示进程的 PID 和命令行参数
## -o:仅显示与搜索条件匹配的第一个进程
pgrep -lo sshd
# 显示进程名和最大的pid
## -l:显示进程的 PID 和命令行参数
## -n:仅显示与搜索条件匹配的进程
pgrep -ln sshd
# 查看以root用户运行的bash进程的pid
## -u 指定用户
pgrep -u root bash
pidof根据进程名查找pid
参数 | 解释 |
---|---|
-s | 仅返回一个进程号。 |
-c | 仅显示具有相同"root"目录的进程。 |
-x | 显示由脚本开启的进程。 |
-o | 指定不显示的进程ID。 |
# 根据进程名查找pid
pidof 精确进程名
仅返回一个nginx进程的进程号:
# 仅返回一个nginx进程的进程号
pidof -s nginx
显示具有相同"root"目录的nginx进程的进程号:
# 显示具有相同"root"目录的nginx进程的进程号
pidof -c nginx
显示由脚本开启的nginx进程的进程号:
# 显示由脚本开启的nginx进程的进程号
pidof -x nginx
指定不显示某个进程ID的nginx进程的进程号:
# 指定不显示某个进程ID的nginx进程的进程号
pidof -o 1234 nginx
pkill
根据名字杀死进程
参考: https://wangchujiang.com/linux-command/c/pkill.html
参数 | 释义 |
---|---|
-o | 仅向找到的最小(起始)进程号发送信号 |
-n | 仅向找到的最大(结束)进程号发送信号 |
-p | 指定父进程号发送信号 |
-g | 指定进程组 |
-t | 指定要终止的终端会话 |
-9 | 强制终止信号 |
-f | 强制结束进程 |
-x | 只匹配精确的进程名 |
# 查看进程的pid
## -l:显示进程的 PID 和命令行参数
## -o:仅显示与搜索条件匹配的第一个进程
pgrep -lo 进程名字
# 结束指定的进程名
## -x 只匹配精确的进程名
pkill -x 进程名字
示例:
# 查看trojan进程的pid
## -l:显示进程的 PID 和命令行参数
## -o:仅显示与搜索条件匹配的第一个进程
pgrep -lo trojan
# 结束名为trojan的进程
## -x 只匹配精确的进程名
pkill -x trojan
## -f 强制结束进程
pkill -xf trojan
结束ssh会话
# 查看当前登录详情
w
# 结束pts/0终端会话
## -9 强制终止信号
## -t 指定要终止的终端会话
pkill -9 -t pts/0
虚拟内存状态查看命令vmstat
# 语法:vmstat [options] [delay [count]]
# 表示每2秒刷新一次
vmstat 2
# 表示每2秒刷新一次,刷新5次后退出
vmstat 2 5
Linux进程相关
pwdx查看pid工作目录
# 查看当前pid进程启动时的工作目录
pwdx $pid
根据pid查看进程完整信息
# 查看进程完整信息
ls –ali /proc/${pid}
cwd
符号链接的是进程运行目录;
exe
符号连接就是执行程序的绝对路径;
cmdline
就是程序运行时输入的命令行命令;
environ
记录了进程运行时的环境变量;
fd
目录下是进程打开或使用的文件的符号连接。
查看哪些进程占用内存最多
!!!注意
: 该软件只支持
Centos7,需要使用epel
源安装Dstat 0.7.2
, RHEL8
安装的是pcp-dstat 5.3.1
,不支持top-mem
等参数
## --top-mem 显示内存使用最多的进程
## 1 4 每隔1秒更新一次,总共更新4次后停止
dstat --top-mem 1 4
查看哪些进程占用cpu最多
## --top-mem 显示CPU使用最多的进程
## 1 4 每隔1秒更新一次,总共更新4次后停止
dstat --top-cpu 3 3
查看进程产生的时间
# 查看僵尸进程产生的时间
ps -eo pid,lstart,etime,cmd|grep anacron
命令后面加&后台运行
前台
进程和用户交互
,需要较高的响应速度,优先级较高;前台进程就是用户使用的有控制终端的进程。后台
进程几乎不和用户交互
,优先级略低。 Linux 的守护进程(Daemon)是一种特殊的后台进程,其独立于终端并周期性地执行任务或等待唤醒
&
使用它在后台运行一个占用时间不长的进程。
nohup
使用它在后台运行一个命令,即使在用户退出时也不受影响。
Linux下常用以下命令管理进程,包括前后台切换及启停:
&
:将 & 放在命令的最后,可以把这个命令放到后台执行Ctrl + z
:当前台正在执行一个命令时,按键 Ctrl + z,将其放到后台并暂停Ctrl + c
:中断当前正在执行的命令jobs
:查看当前有多少正在后台运行的命令fg
:将后台中的命令调至前台继续运行bg
:将后台任务唤醒,并在后台运行
将程序放入后台
# 以后台运行程序
exe_name &
查看运行中的后台运行
# 查看运行中的后台运行
jobs -l
说明:以上输出表示当前终端有1个后台工作进程sleep,工作号
为 1
,状态是运行标志是"+
"。 "+
"号代表最近一个放入后台的工作
,也是工作恢复时默认恢复的工作。 "-
"号代表倒数第二个放入后台的工作
,而第三个以后的工作
就没有"+-"标志
了。
恢复&后台运行程序为前台运行
# 恢复&后台运行程序为前台运行
fg job_id
将任务放入后台并且暂停
# 将任务放入后台并且暂停
catl+z
查看暂停程序
# 查看暂停程序
job
将暂停的任务恢复后台运行
# 恢复后台运行
bg job_id
后台进程&示例
在命令后加上&
就会进入后台进程
,但不是所有命令都支持后台
#!/usr/bin/env bash
# 快速检查服务器是否可用
date;
for i in {1..100}; do
(ping -c 2 rhcsa$i &>>/dev/null && echo "rhcsa$i success" || echo -e "\033[31mrhcsa$i faild\033[0m") &
done
wait;
date
nohup退出账户时进程不结束
nohup
和&
可以不在终端前台
运行程序,使用nohup
与&
符号配合运行一个命令
#
nohup command &
nohup
命令可以在你退出帐户之后继续运行相应的进程。
nohup
就是不挂起
的意思(no hang up),该命令使进程忽略hangup(挂起)信号
。
# 退出终端时不结束进程,并将输出写入到文件
nohup command > myout.file 2>&1
守护进程(daemon)和一般进程有什么差别呢?
Linux的退出码
https://linux.cn/article-16059-1.html?utm_source=rss&utm_medium=rss
退出码 | 解释 |
---|---|
0 | 命令成功执行 |
1 | 通用错误代码 |
2 | 命令(或参数)使用不当 |
126 | 权限被拒绝(或)无法执行 |
127 | 未找到命令,或 PATH 错误 |
128+n | 命令被信号从外部终止,或遇到致命错误 |
130 | 通过 Ctrl+C 或 SIGINT 终止(终止代码 2 或键盘中断) |
143 | 通过 SIGTERM 终止(默认终止) |
255/* | 退出码超过了 0-255 的范围,因此重新计算(LCTT 译注:超过 255 后,用退出码对 256 取模) |
# 查看退出码
echo $?