前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >系统进程管理查看

系统进程管理查看

作者头像
全栈工程师修炼指南
发布2022-09-28 19:58:30
8840
发布2022-09-28 19:58:30
举报
文章被收录于专栏:全栈工程师修炼之路

[TOC]

0x00 进程查看

HUP进程(Process):就是正在运行的程序

  • 是指正在支持的一个程序或命令,每个进程都是一个运行的实体,都有自己的地址空间,并有一定进程管理的作用:
  • 判断服务器健康状态,查看系统中所有进程,杀死进程.
fuser 命令

描述:用于报告进程使用的文件和网络套接字,还可以用指定的文件或者文件系统显示进程进程号,默认情况下每一个文件名后会跟着一个字母来表示类型,那些本地进程使用file参数指定的本地或远程文件。

命令安装:

代码语言:javascript
复制
Psmisc软件包包含三个帮助管理/proc目录的程序
yum install psmisc -y #可以安装下列程序: fuser, killall,pstree和pstree.x11(到pstree的链接)

语法参数:

代码语言:javascript
复制
# USage:
fuser [-fMuvw] [-a|-s] [-4|-6] [-c|-m|-n SPACE] [-k [-i] [-SIGNAL]] NAME...
-4 IPv4
-6 IPv6
-a:显示命令行中指定的所有文件;
-k:杀死访问指定文件的所有进程;
-i:杀死进程前需要用户进行确认;
-l:列出所有已知信号名;
-m:指定一个被加载的文件系统或一个被加载的块设备;
-n:选择不同的名称空间,指定关键字进行搜索,如 文件、UDP、TCP
-u:在每个进程后显示所属的用户名。
-s 不显示处理信息
-u PID显示用户名
-v 运行时,显示相信处理信息
- 清零
-m 挂载文件系统
-signal 发送信号
-V 显示版本显示

#对于阻塞特别设备,此命令列出了使用该设备上任何文件的进程。 
c:指示进程的工作目录。
e:指示该文件为进程的可执行文件(即进程由该文件拉起)。
f:指示该文件被进程打开,默认情况下f字符不显示。
F:指示该文件被进程打开进行写入,默认情况下F字符不显示。
r:指示该目录为进程的根目录。
m:指示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。

实际案例:

代码语言:javascript
复制
#示例1.显示支持的信号,使用最多的是
fuser -l  #HUP 平滑启动

#示例2. 要列出使用/etc/passwd文件的本地进程的进程号与用户登录名称
fuser /etc/passwd
fuser -u /etc/passwd

#实例3.进程操作并获取进程对应的 PID
fuser -a /etc/passwd       ##显示与/etc/passwd 目录相关的进程
fuser -k /etc/passwd       ##杀死与/etc/passwd 目录相关的进

#示例5.根据通信协议和端口来看pid信息
fuser -nv tcp 80     #指定名称空加端口,显示器进程信息
# 端口/协议:     进程PID  当前连接的PID
# 80/tcp:         1005    28805
fuser -k -n tcp 80  # 会终止该端口号进程

#示例4.任一命令都列出了进程号和用户名,然后终止每个正在使用/dev/hd1 (/home)文件系统的进程。仅有root用户能终止属于另一用户的进程。
#如果您正在试图卸下/dev/hd1文件系统,而一个正在访问/dev/hd1文件系统的进程不允许这样,您可能希望使用此命令
fuser -k -u -c /dev/hd1 或者 fuser -kuc /home   #注意使用啊,貌似会关闭终端
fuser -km /www   #快速停止占用(根据挂载的目录)
ps 命令

描述:在Linux系统中PS(Process Status的缩写)命令常常用来用来列出系统中当前运行的进程,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等;,总之大部分信息都是可以通过执行该命令得到的。

Tips: Linux上进程有5种状态:

  • 运行:正在运行或在运行队列中等待 - R 运行 runnable (on run queue);
  • 中断:休眠中, 受阻, 在等待某个条件的形成或接受到信号 - S 中断 sleeping;
  • 不可中断:收到信号不唤醒和不可运行, 进程必须等待直到有中断发生 - D 不可中断 uninterruptible sleep (usually IO) ;
  • 僵死:进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放 - Z 僵死 a defunct (”zombie”) process ;
  • 停止:进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行 - T 停止 traced or stopped;

命令参数:

代码语言:javascript
复制
-a:显示所有终端机下执行的程序,除了阶段作业领导者之外。
a:显示现行终端机下的所有程序,包括其他用户的程序。
-A:显示所有程序。
-c:显示CLS和PRI栏位。
c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。
-C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。
-d:显示所有程序,但不包括阶段作业领导者的程序。
-e:此选项的效果和指定"A"选项相同。
e:列出程序时,显示每个程序所使用的环境变量。
-f:显示UID,PPIP,C与STIME栏位。
f:用ASCII字符显示树状结构,表达程序间的相互关系。
-g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。
g:显示现行终端机下的所有程序,包括群组领导者的程序。
-G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。
h:不显示标题列。
-H:显示树状结构,表示程序间的相互关系。
-j或j:采用工作控制的格式显示程序状况。
-l或l:采用详细的格式来显示程序状况。
L:列出栏位的相关信息。
-m或m:显示所有的执行绪。
n:以数字来表示USER和WCHAN栏位。
-N:显示所有的程序,除了执行ps指令终端机下的程序之外。
-p<程序识别码>:指定程序识别码,并列出该程序的状况。
p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。
r:只列出现行终端机正在执行中的程序。
-s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。
s:采用程序信号的格式显示程序状况。
S:列出程序时,包括已中断的子程序资料。
-t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。
t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。
-T:显示现行终端机下的所有程序。
-u<用户识别码>:此选项的效果和指定"-U"选项相同。
u:以用户为主的格式来显示程序状况。
-U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。
U<用户名称>:列出属于该用户的程序的状况。
v:采用虚拟内存的格式显示程序状况。
-V或V:显示版本信息。
-w或w:采用宽阔的格式来显示程序状况
-o: 指定显示进程的信息以列为主
x:显示所有程序,不以终端机来区分。
X:采用旧式的Linux i386登陆格式显示程序状况。
-y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。
-<程序识别码>:此选项的效果和指定"p"选项相同。
--cols<每列字符数>:设置每列的最大字符数。
--columns<每列字符数>:此选项的效果和指定"--cols"选项相同。
--cumulative:此选项的效果和指定"S"选项相同。
--deselect:此选项的效果和指定"-N"选项相同。
--forest:此选项的效果和指定"f"选项相同。
--headers:重复显示标题列。
--lines<显示列数>:设置显示画面的列数。
--no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。
--group<群组名称>:此选项的效果和指定"-G"选项相同。
--Group<群组识别码>:此选项的效果和指定"-G"选项相同。
--pid<程序识别码>:此选项的效果和指定"-p"选项相同。
--rows<显示列数>:此选项的效果和指定"--lines"选项相同。
--sid<阶段作业>:此选项的效果和指定"-s"选项相同。
--tty<终端机编号>:此选项的效果和指定"-t"选项相同。
--user<用户名称>:此选项的效果和指定"-U"选项相同。
--User<用户识别码>:此选项的效果和指定"-U"选项相同。
--version:此选项的效果和指定"-V"选项相同。
--widty<每列字符数>:此选项的效果和指定"-cols"选项相同。

格式头说明:

代码语言:javascript
复制
USER  PID PPID(父进程) C(进程占用CPU的百分比 ) %CPU(占用的CPU) %MEM(占用的内存) VSZ(占虚拟内存KB) RSS(占物理内存KB) TTY(终端)STAT(进程状态)START(占用实时间) STIME(进程启动的时间) TIME COMMAND
root      7248          0.0           0.0              110104          864       tty1     Ss+  14:06   0:00 /sbin/agetty --noclear tty1 linux

格式说明:

PID:进程标识符,系统为每一个进程分配一个识别码,称为PID

VSZ:该进程使用的虚拟內存量(KB)

RSS:该进程占用的固定內存量(KB)(驻留中页的数量) (RSS is the “resident set size” meaning physical memory used)

START:该进程的启动时间

TIME:该进程占用CPU的运算时间,注意不是系统时间;

TTY:linux 中tty1~tty6表示本地字符终端 tty7图形终端 pts/0 -255虚拟终端很多都是?表示很多进程都是系统进程

代码语言:javascript
复制
串行端口终端(/dev/ttySn)
伪终端(/dev/pty/) 
控制终端(/dev/tty) 
控制台终端(/dev/ttyn, /dev/console) 
虚拟终端(/dev/pts/n)

COMMAND:产生此进程的命令名

STAT状态位常见的状态字符有:

代码语言:javascript
复制
D      //无法中断的休眠状态(通常 IO 的进程)
R(running)       //正在运行可中在队列中可过行的
S(sleeping)      //处于休眠状态
T(terminate)     //停止或被追踪
W      //换出,进入内存交换 (从内核2.6开始无效) 
X      //死掉的进程 (基本很少见)
Z      //僵尸进程; 
<      //优先级高的进程 
N      //优先级较低的进程 
L      //有些页被锁进内存; 
s      //进程的领导者(在它之下有子进程)
l      //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads)
P      //等待交换页
I      //(idle) 空闲
+      //位于后台的进程组

实际案例:

代码语言:javascript
复制
#示例1.显示每个环节变量,以accii树形显示并且不显示标题
$ps efh   #以System V风格显示进程
7231 pts/1    Ss     0:00 -bash USER=root LOGNAME=root HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr
7291 pts/1    R+     0:00  \_ ps efh XDG_SESSION_ID=31 HOSTNAME=localhost.localdomain TERM=xterm SHELL=/bi
7248 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux LANG= PATH=/usr/local/sbin:/usr/local/bin:/usr
$ps aux #最初用在Unix Style中

#显示所有进程,还有状态显示(与ps -A的区别)
ps x | head -n 2
# PID TTY      STAT   TIME COMMAND
# 1 ?        Ss     0:17 /usr/lib/systemd/systemd --switched-root --system --deserialize 22


#示例2.显示执行的命令uid以及PID和父进程 (常用)
ps -ef  #UID-PID-Command
ps -ef | grep firefox
# UID        PID  PPID  C STIME TTY          TIME CMD
# root         1     0  0 6月11 ?       00:00:01 /usr/lib/systemd/systemd --switched-root --system --deseria

#示例3.采用linux标准命令格式查看进程执行的cmd命令
ps -le 
# -l 长格式显示。显示更加详细的信息
# -e 显示所有进程和-A作用一致
# F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
# 4 S     0     1     0  0  80   0 - 31359 ep_pol ?        00:00:01 systemd
ps -p 7193
#   PID TTY          TIME CMD
#  7193 ?        00:00:00 sshd

#实例4.线程的子线程查看
$ps -p 30520
$ps -P 30520   #列表格式差异
PID TTY          TIME CMD
30520 ?        00:00:00 docker-proxy 
$ps -Hp 30520
PID PSR TTY      STAT   TIME COMMAND
30520   3 ?        Sl     0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9002 -container-ip 172.18.0.4 -container-port 3306

#实例5.指定显示进程的某些信息
ps -o %cpu,%mem,user,group,comm,nice,pid,stat
%CPU %MEM USER     GROUP    COMMAND          NI   PID STAT
 0.0  0.0 root     root     bash              0  5443 Ss
 0.0  0.0 root     root     ps                0  5492 R+
[root@vm-1575613390 ~]# ps -a -o %cpu,%mem,user,group,comm,

# 实例6.进程条件过滤
# 1.CPU占用最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k3|head -10 

# 2.内存消耗最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k4|head -10 

# 3.虚拟内存使用最多的前10个进程 
ps auxw|head -1;ps auxw|sort -rn -k5|head -10

# 4.RSS是“驻留集大小”表示使用的物理内存最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k6|head -10

# 5.按照进程运行时间进行倒序排序显示 
ps auxw|head -1;ps auxw|sort -rn -k2|head -10

# 6.按进程消耗内存多少排序的方法
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | sort -k5nr
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' --sort -rsz
  # PID COMMAND         COMMAND                     %CPU   RSZ    VSZ STIME USER       UID
  # 503 systemd-journal /lib/systemd/systemd-journa  0.0 140656 518176 Feb10 root        0

WeiyiGeek.psaux

pstree 命令

描述:以树状图的方式展现进程之间的派生关系,显示效果比较直观;

安装方式:

代码语言:javascript
复制
#RHEL/CentOS
yum install psmisc

#Debian/Ubuntu
apt install psmisc

基础语法参数:

代码语言:javascript
复制
# 语法:
pstree(选项)

# 参数:
-a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示;
-c:不使用精简标示法;
-G:使用VT100终端机的列绘图字符;
-h:列出树状图时,特别标明现在执行的程序;
-H<程序识别码>:此参数的效果和指定"-h"参数类似,但特别标明指定的程序;
-l:采用长列格式显示树状图;
-n:用程序识别码排序。预设是以程序名称来排序;
-p:显示程序识别码;PID
-u:显示用户名称;UID
-U:使用UTF-8列绘图字符;
-V:显示版本信息。

实际案例:

代码语言:javascript
复制
#示例1.简单示例
pstree     # init 进程 systemd 为系统的 PID 1 号进程,所有的进程都在 systemd 的管理之下。
pstree -u
pstree -p  # 显示当前所有进程的进程号和进程id
pstree -a  # 显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。

WeiyiGeek.pstree

pgrep 命令

描述:以名称为依据从运行进程队列中查找进程,并显示查找到的进程id;每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合

基础语法参数:

代码语言:javascript
复制
#语法
pgrep [选项] <进程名>     # 显示进程的PID
# 参数
-o:仅显示找到的最小(起始)进程号;
-n:仅显示找到的最大(结束)进程号;
-l:显示进程名称;
-P:指定父进程号;
-g:指定进程组;
-t:指定开启进程的终端;
-u:指定进程的有效用户ID。

实际案例:

代码语言:javascript
复制
#示例1.进程名称:指定要查找的进程名称,同时也支持类似grep指令中的匹配模式.
pgrep sshd
pgrep -f sshd
5460
7220
7222

#示例2.显示进程及其名称
pgrep -l ssh
5460 sshd
7222 sshd
7335 sshd
7337 sshd

#示例3.显示最小最大的进程号
$pgrep -lo sshd
5460 sshd
$pgrep -ln sshd 
7222


#示例4.显示指定UID的用户
$pgrep -au root  #root用户
5779 /usr/sbin/smbd --foreground --no-process-group
5780 /usr/sbin/smbd --foreground --no-process-group
5781 /usr/sbin/smbd --foreground --no-process-group
pidof 命令

描述:能可以根据可执行进程来快速找到进程的PID号

代码语言:javascript
复制
#语法
 pidof  [-s] [-c] [-n] [-x] [-m] [-o omitpid[,omitpid..]]  [-o omitpid[,omitpid..]..]
       program [program..]  # 进程名称:指定要查找的进程名称。

-s:仅返回一个进程号;
-c:仅显示具有相同“root”目录的进程;
-x:显示由脚本开启的进程;
-o:指定不显示的进程ID。

实际案例:

代码语言:javascript
复制
#示例1.显示服务相关的进程
$pidof sshd
7195 7193 5459

#示例2.只显示一个进程号
$pidof -s httpd
47365
pwdx 命令 - 通过PID找出程序运行的绝对路

描述:此命令可以通过PID找出程序的绝对路径,在查找某个java编写的程序运行情况可通过jps命令查看,然后可以通过显示的pid进行程序定位;

使用说明:

代码语言:javascript
复制
#(1)找到mysqld进程pid标识然后找绝对路径
$top -n2 -d2 
# 30337 polkitd   20   0 2701192 485928  21608 S   0.3 12.5  75:08.94 mysqld
$pwdx 30337
30337: /var/lib/mysql

注意事项:

(1) pidof命令必须输入正确的进程名,如果输入进程名不全,则显示为空。而pgrep命令获取进程ID时,是可以不需要输入准确的进程名。验证效果如下命令所示:

(2) 通过/proc/进程id/下面的进程相关文件进行查看进程信息

代码语言:javascript
复制
# 进程执行
$cat /proc/26195/cmdline | tr \'\0\' \' \'
./bt_uinfo_memcached -p 20211 -u root -l 0.0.0.0 -m 3072 -d root@ubuntu:~#

# 进程zhun
$cat /proc/26195/status | tr \'\0\' \' \'
Name: bt_uinfo_memcac
State: S (sleeping) 

# 进程信息
$cat /proc/26195/stat
26195 (bt_uinfo_memcac) S 1 26195 26195 0 -1 4202560 42735 0 0 0 3517 5339 0 0 20 0 6 0 293270594 475316224
36956 18446744073709551615 1 1 0 0 0 0 0 4097 2 18446744073709551615 0 0 17 9 0 0 0 0 0 

# 进程执行路径
$sudo ls -l /proc/27628/exe
lrwxrwxrwx 1 root root 0 2013-05-29 16:00 /proc/27628/exe -> /home/dspeak/myshard/2013/room_1_0/bin/shard_d
lsipc 命令

描述:该命令可在进程间通信设施,调用进程具有读取访问lsipc节目信息。

基础示例:

代码语言:javascript
复制
# 示例1.查看消息队列/共享内存/信号量
$lsipc
RESOURCE DESCRIPTION                               LIMIT USED  USE%
MSGMNI   消息队列数量                               7572    0 0.00%
MSGMAX   消息的最大大小(字节)                       8192    -     -
MSGMNB   默认最大队列大小(字节)                     16384    -     -
SHMMNI   共享内存段                                 4096    2 0.05%
SHMALL   共享内存页                                 18446744073692774399  178 0.00%
SHMMAX   共享内存段的最大大小(字节)                 18446744073692774399    -     -
SHMMIN   共享内存段的最小大小(字节)                  1    -     -
SEMMNI   信号量标识符的数目                          128    2 1.56%
SEMMNS   信号量总量                                 32000   28 0.09%
SEMMSL   每个信号量集的最大信号量。                 250    -     -
SEMOPM   每个semop的最大操作数                     32    -     -
SEMVMX   信号量最大值                              32767    -     -
pmap 命令 - 报告进程的内存映射

描述:pmap 工具主要用于报告进程“内存映射”情况,指定需要显示内存映射关系的进程号,可以是多个进程号。

语法参数

代码语言:javascript
复制
# SYNOPSIS
pmap [options] pid [...]

# OPTIONS
-x, --extended : 显示扩展格式
-d, --device : 显示设备格式
-q, --quiet : 不显示头信息
-A, --range low,high : Limit results to the given range to low and high address range.  Notice that the low  and high arguments are single string separated with comma.
-X : Show even more details than the -x option.  WARNING:  format  changes  according  to /proc/PID/smaps
-XX : Show everything the kernel provides
-p, --show-path : Show full path to files in the mapping column
-c, --read-rc : Read the default configuration
-C, --read-rc-from file  :  Read the configuration from file
-n, --create-rc  : Create new default configuration
-N, --create-rc-to file  :  Create new configuration to file

使用示例:

代码语言:javascript
复制
# 1.显示进程扩展格式
$ pidof dockerd
  # 3220194
$ pmap -x 3220194
  # 3220194:   /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
  # Address           Kbytes     RSS   Dirty Mode  Mapping
  # 000000c000000000   10240    9244    9240 rw---   [ anon ]
  # 000000c000a00000   24576    5736    5732 rw---   [ anon ]
  # ....
  # 000055ad65318000   24764       0       0 r---- dockerd
  # ....
  # 00007f14bc007000      16       0       0 r---- libresolv-2.31.so (deleted)
  # 00007f14bc00b000      64       0       0 r-x-- libresolv-2.31.so (deleted)
  # ....
  # 00007ffe84662000     132       4       4 rw---   [ stack ]
  # ---------------- ------- ------- -------
  # total kB         2196164   39852   25784

# 2.统计dockerd进程占用的物理内存。
$ cat /proc/3220194/smaps | grep '^Rss:' | awk '{sum +=$2} END{print sum}'
39852

0x01 进程杀死
kill 命令 - 进程杀死

描述:用来在Linux杀死执行中的程序或工作进程的命令, kill可将指定的信息送至程序,预设的信息为SIGTERM(15),可将指定程序终止,若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序->程序或工作的编号可利用ps指令或job指令查看

代码语言:javascript
复制
#语法
kill [信号代码] <进程PID/作业识别号>     

#参数
-a:当处理当前进程时,不限制命令名和进程号的对应关系;
-l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称;
-p:指定kill 命令只打印相关进程的进程号,而不发送任何信号;
-s <信息名称或编号>:指定要送出的信息;
-u:指定用户。

实际案例:

代码语言:javascript
复制
#示例1.显示所有信号名称,只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略
kill -l   
#下面是常用的信号:根据PID向进程发送信号,常用来结束进程,默认信号为-9
-l [信号数字]显示、翻译信号代码
-1 , -HUP 挂起,终端断线
-2 , -INT 从键盘中断中断(同 Ctrl + C)
-3 , -QUIT 从键盘退出退出(同 Ctrl + \\)
-4 , -ILL 非法指令
-6 , -ABRT 发送abort 信号退出
-9 , -KILL   强制终止
-11 , -SEGV 内存错误
-13 , -PIPE 破坏管道
-14 , -ALRM
-15 , -TERM 发送Termination 信号 终止
-19 , -STOP 停止进程,但不结束( Ctrl+z )
-18 , -CONT 继续运行已停止的进程(与-stop相反,fg/bg命令)


#示例2.进程终止
#先用ps命令来查看该进程对应的PID,可以看到该进程对应的PID是345,现在使用kill命令来终止该进程.
#345 1 00:00:00 find / -name foxy.jpg 
kill 345
kill -l 223  #重启进程
kill -9 2236 #强制结束进程
kill -s 9 2236 

#示例3.平滑重启服务,不会跳出当前登录用户
kill -HUP 1523

#示例4.关闭读取配置文件后重启(平滑重启)
kill -SIGHUP $(pidof dockerd)

#示例5.指定停止后台执行的任务
jobs
kill %1  #这里的数字是按照jobs返回的数字

补充说明:

Q:SIGINT、SIGKILL和SIGTERM区别?

  • (1) SIGINT与SIGTERM区别 1)SIGINT关联ctrl+c 2)SIGINT只能结束前台进程 3)通过ctrl+c对当前进程发送结束信号,信号被进程树接收到(即:不仅当前进程,子进程也会收到结束信号)
  • (2) SIGTERM与SIGKILL 1)SIGTERM可以被阻塞、处理和忽略;因此有的进程不能按预期的结束 2)kill不使用参数:发送SIGTERM信号,只有当前进程收到信号若当前进程被kill,则子进程的父进程就会更改为init即pid为1 3)kill命令的默认不带参数发生的信号SIGTERM它让程序友好的退出 ,当程序未退出时,可以使用kill -9强制退出;
pkill 命令 - 结束一个进程组

描述:该命令会结束进程族,如果结束单个进程请用kill,其检查的是 /proc/ 下面的 pid 目录的 cmdline 文件和 status 文件;

代码语言:javascript
复制
# 语法
pkill (选项) (参数)

# 参数
-o:仅向找到的最小(起始)进程号发送信号;
-n:仅向找到的最大(结束)进程号发送信号;
-P:指定父进程号发送信号;
-g:指定进程组;
-t:指定开启进程的终端, (用户踢出)

实际案例:

代码语言:javascript
复制
#示例1.结束所有有关于firefox的进程;
pkill firefox

#实例2.结束多余的用户会话(重要)
$w 
pkill -9 -t tty1  #只有超级用户才能剔除用户   
pkill -9 -t pts/1 #远程终端

#示例3.使用进程名称直接kill掉
pkill -f name
killall 命令 - 杀死单一进程或者所属进程

描述:killall 和 pkill 应用方法差不多也是直接杀死运行中的程序把这ps和grep两个过程合二为一; 它查看的是 /proc/pid/stat 文件内容;如果您想杀掉单个进程请用kill 来杀掉.

语法&参数:

代码语言:javascript
复制
# 安装
yum install psmisc -y 

# 语法
killall [选项] [信号] <进程名>   

# 参数
-e:对长名称进行精确匹配;
-l:忽略大小写的不同;
-p:杀死进程所属的进程组;
-i:交互式杀死进程,杀死进程前需要进行确认;
-l:打印所有已知信号列表;
-q:如果没有进程被杀死。则不输出任何信息;
-r:使用正规表达式匹配要杀死的进程名称;
-s:用指定的进程号代替默认信号“SIGTERM”;
-u:杀死指定用户的进程。

实际操作:

代码语言:javascript
复制
#示例0.查看进程信号
killall -l
HUP   # 挂起,终端断线
INT   # 从键盘中断中断(同 Ctrl + C)
QUIT  # 从键盘退出退出(同 Ctrl + \\)
ILL TRAP ABRT IOT BUS FPE 
KILL  # 终止信号  
USR1 SEGV USR2 PIPE ALRM 
TERM  # 发送Termination 信号 终止
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED

#示例1.删除所有的同名进程显示信号量
killall vi   #杀死所有同名进程

#示例2.删除apache2得一个进程组:
killall -g apache2
killall5 命令 - 向所有进程发送一个信号,除了内核线程和它自己会话中的进程

描述:killall5是SystemV killall命令,它向所有进程发送一个信号,除了内核线程和它自己会话中的进程,所以它不会杀死运行脚本的shell。 killall5也可以作为pidof调用,它只是一个指向killall5程序的(符号)链接。

注意: 不要直接执行该命令,如果执行会向所有进行发送一个关闭信号会直接导致机器宕掉;

基础语法:

代码语言:javascript
复制
killall5 -signalnumber [-o omitpid[,omitpid..]]  [-o omitpid[,omitpid..]..]

# 常用参数
-o	省略具有该进程id的进程

# 返回值
如果程序终止进程,则返回零。
如果没有进程被杀死,它返回2。
如果无法找到任何进程(/proc/丢失)返回1

基础示例:

代码语言:javascript
复制
# 示例1.杀死除1122外外的所有进程
killall5 -o 1122

0x02 进程进程优先级

CPU 在同一个时间只能执行一个指令,顺序由进程优先级来排序,数字越小优先级越高

代码语言:javascript
复制
#如ps -le命令中可以看见
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0     1     0  0  80   0 - 31359 ep_pol ?        00:00:01 systemd
4 S     0  7339  7337  0  80   0 - 18050 poll_s ?        00:00:00 sftp-server

PRI:Priority  #优先权
NI:Nice #精密的

修改NI值的几个注意事项: 1)NI的值范围-20~19 2)普通用户调制NI值范围0~19而且只能调整自己的进程 3)普通用户只能调高NI,而不能降低NI值 4)root用户才能设定NI值为负值,而且可以调整任何用户的进程;计算:PRI(最终值)= PRI(原始值) + NI 5)用户只能修改NI 不能直接修改PRI

nice 命令

描述:用于以指定的进程调度优先级启动其他的程序,nice命令可以给新执行的命令直接赋予NI值,但不能修改已经存在的进程NI值.

代码语言:javascript
复制
用法:nice [选项] [命令 [参数] ]
-n:指定进程的优先级(整数)。

实际案例:

代码语言:javascript
复制
#1.新建一个进程并设置优先级,将当前目录下的documents目录打包,但不希望tar占用太多CPU:
nice -19 tar zcf pack.tar.gz documents
#方法非常简单,即在原命令前加上nice -19。很多人可能有疑问了,最低优先级不是19么?
#那是因为这个“-19”中的“-”仅表示参数前缀;所以如果希望将当前目录下的documents目录打包,并且赋予tar进程最高的优先级:
nice --19 tar zcf pack.tar.gz documents

#示例2.将httpd启动加入优先级
nice -n -5 service httpd start  #加入优先级
renice 命令

描述:修改正在运行的进程的调度优先级,预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权

  • 只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级
  • 使用renice命令修改已经存在进程的NI值的命令
代码语言:javascript
复制
#语法参数
renice [优先级] PID [选项]

-g:指定进程组id;
-p<程序识别码>:改变该程序的优先权等级,此参数为预设值。
-u:指定开启进程的用户名。

实际案例:

代码语言:javascript
复制
# 将行程id为987及32的行程与行程拥有者为daemon及root的优先序号码加1:
renice 1 987 -u daemon root -p 32   #注意:每一个进程都有一个唯一的id。
0x03 进程切换
unshare 命令

描述:/usr/bin/unshare是Linux自带的命令实际通过unshare()系统调用实现的,调用的主要作用就是不启动一个新进程就可以起到隔离效果,简单的说就是跳出原先的namespace进行操作,使得原进程就可以进行一些需要改隔离的操作;

unshare() 在 C 语言库中的声明如下:

代码语言:javascript
复制
#define _GNU_SOURCE
#include <sched.h>
int unshare(int flags);

基础语法:

代码语言:javascript
复制
用法:
unshare [options] <program> [<argument>...]
选项:
 -m, --mount               unshare mounts namespace
 -u, --uts                 unshare UTS namespace (hostname etc)
 -i, --ipc                 unshare System V IPC namespace
 -n, --net                 unshare network namespace
 -p, --pid                 unshare pid namespace
 -U, --user                unshare user namespace
 -f, --fork                执行unshare的进程fork一个新的子进程,在子进程里执行unshare传入的参数
     --mount-proc[=<dir>]  mount proc filesystem first (implies --mount)
 -r, --map-root-user       将当前用户映射到根用户(暗指--user)
     --propagation <slave|shared|private|unchanged>
                           modify mount propagation in mount namespace
 -s, --setgroups allow|deny  control the setgroups syscall in user namespaces

基础示例:

代码语言:javascript
复制
# 1.隔离mnt的Namespace
unshare --mount /bin/bash

# 2.隔离ipc的Namespace
unshare --ipc /bin/bash

# 3.把当前进程的 user namespace 设置成了 root
unshare -u sh -c whoami
root

# 4.该命令unshares一个或多个名称空间,并执行该命令在其命令行参数提供,实现取消共享
$ readlink /proc/$$/ns/mnt
mnt:[4026531840]
$ sudo ./unshare -m /bin/bash
$ readlink /proc/$$/ns/mnt
mnt:[4026532325]

# 5.进程fork一个新的子进程有新的pid,因为子进程已经隔离了pid namespace所以子进程的ps 无法看到父进程里能看到的那些进程列表。
sudo unshare --fork --pid --mount-proc bash
ps -ejf
UID         PID   PPID   PGID    SID  C STIME TTY          TIME CMD
root          1      0      1      0  0 11:39 pts/0    00:00:00 bash
root         27      1     27      0  0 11:39 pts/0    00:00:00 ps -ejf
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 进程查看
    • fuser 命令
      • ps 命令
        • pstree 命令
          • pgrep 命令
            • pidof 命令
              • pwdx 命令 - 通过PID找出程序运行的绝对路
                • lsipc 命令
                  • pmap 命令 - 报告进程的内存映射
                  • 0x01 进程杀死
                    • kill 命令 - 进程杀死
                      • pkill 命令 - 结束一个进程组
                        • killall 命令 - 杀死单一进程或者所属进程
                          • killall5 命令 - 向所有进程发送一个信号,除了内核线程和它自己会话中的进程
                          • 0x02 进程进程优先级
                            • nice 命令
                              • renice 命令
                              • 0x03 进程切换
                                • unshare 命令
                                相关产品与服务
                                容器服务
                                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档