[TOC]

0x00 进程查看

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

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

fuser 命令

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

命令安装:

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

语法参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 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:指示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#示例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;

命令参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
-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"选项相同。

格式头说明:

1
2
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虚拟终端很多都是?表示很多进程都是系统进程
    1
    2
    3
    4
    5
    串行端口终端(/dev/ttySn)
    伪终端(/dev/pty/)
    控制终端(/dev/tty)
    控制台终端(/dev/ttyn, /dev/console)
    虚拟终端(/dev/pts/n)
  • COMMAND:产生此进程的命令名
  • STAT状态位常见的状态字符有:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    D      //无法中断的休眠状态(通常 IO 的进程)
    R(running) //正在运行可中在队列中可过行的
    S(sleeping) //处于休眠状态
    T(terminate) //停止或被追踪
    W //换出,进入内存交换 (从内核2.6开始无效)
    X //死掉的进程 (基本很少见)
    Z //僵尸进程;
    < //优先级高的进程
    N //优先级较低的进程
    L //有些页被锁进内存;
    s //进程的领导者(在它之下有子进程)
    l //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads)
    P //等待交换页
    I //(idle) 空闲
    + //位于后台的进程组

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#示例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+
[[email protected] ~]# 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

WeiyiGeek.psaux

WeiyiGeek.psaux


pstree 命令

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

安装方式:

1
2
3
4
5
#RHEL/CentOS
yum install psmisc

#Debian/Ubuntu
apt install psmisc

基础语法参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 语法:
pstree(选项)

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

实际案例:

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

WeiyiGeek.pstree

WeiyiGeek.pstree


pgrep 命令

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

基础语法参数:

1
2
3
4
5
6
7
8
9
10
#语法
pgrep [选项] <进程名> # 显示进程的PID
# 参数
-o:仅显示找到的最小(起始)进程号;
-n:仅显示找到的最大(结束)进程号;
-l:显示进程名称;
-P:指定父进程号;
-g:指定进程组;
-t:指定开启进程的终端;
-u:指定进程的有效用户ID。

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#示例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号

1
2
3
4
5
6
7
8
#语法
pidof [-s] [-c] [-n] [-x] [-m] [-o omitpid[,omitpid..]] [-o omitpid[,omitpid..]..]
program [program..] # 进程名称:指定要查找的进程名称。

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

实际案例:

1
2
3
4
5
6
7
#示例1.显示服务相关的进程
$pidof sshd
7195 7193 5459

#示例2.只显示一个进程号
$pidof -s httpd
47365


pwdx 命令 - 通过PID找出程序运行的绝对路

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

使用说明:

1
2
3
4
5
#(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/下面的进程相关文件进行查看进程信息
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 进程执行
    $cat /proc/26195/cmdline | tr \'\0\' \' \'
    ./bt_uinfo_memcached -p 20211 -u root -l 0.0.0.0 -m 3072 -d [email protected]:~#

    # 进程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节目信息。

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 示例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 - -


0x01 进程杀死

kill 命令 - 进程杀死

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

1
2
3
4
5
6
7
8
9
#语法
kill [信号代码] <进程PID/作业识别号>

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

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#示例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 文件;

1
2
3
4
5
6
7
8
9
# 语法
pkill (选项) (参数)

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

实际案例:

1
2
3
4
5
6
7
8
9
10
#示例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 来杀掉.

语法&参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 安装
yum install psmisc -y

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

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

实际操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#示例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程序的(符号)链接。

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

基础语法:

1
2
3
4
5
6
7
8
9
killall5 -signalnumber [-o omitpid[,omitpid..]]  [-o omitpid[,omitpid..]..]

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

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

基础示例:

1
2
# 示例1.杀死除1122外外的所有进程
killall5 -o 1122


0x02 进程进程优先级

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

1
2
3
4
5
6
7
#如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值.

1
2
用法:nice [选项] [命令 [参数] ]
-n:指定进程的优先级(整数)。

实际案例:

1
2
3
4
5
6
7
8
#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值的命令
1
2
3
4
5
6
#语法参数
renice [优先级] PID [选项]

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

实际案例:

1
2
# 将行程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 语言库中的声明如下:

1
2
3
#define _GNU_SOURCE
#include <sched.h>
int unshare(int flags);

基础语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
用法:
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

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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