0%

linux | 进程相关

  • ps
  • kill

kill


kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]
  • -l <信息编号>  若不加<信息编号>选项,则 -l 参数会列出全部的信息名称。
  • -s <信息名称或编号>  指定要送出的信息。
  • [程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号。

使用 kill -l 命令列出所有可用信号。

HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2

ps: 因为我是用 macbook 输出的这些,所以,相对于 linux 难免有一些遗漏。

最常用的信号是:

  • 1 (HUP):重新加载进程。
  • 9 (KILL):杀死一个进程。
  • 15 (TERM):正常停止一个进程。

实例

杀死进程

kill 12345

强制杀死进程

kill -KILL 123456

发送SIGHUP信号,可以使用一下信号

kill -HUP pid

彻底杀死进程

kill -9 123456

杀死指定用户所有进程

1
2
#kill -9 $(ps -ef | grep hnlinux) //方法一 过滤出hnlinux用户进程 
#kill -u hnlinux //方法二

一般我们杀死一个进程都建议确定其进程的 PID ,这是因为,不使用这个的话,可能会误伤程序。

另外上面那个杀死 linux 用户的进程,比如说

1
kill $(ps -ef | grep python)

这虽然能杀死相关的程序,但是,并不意味着,这是正确的,这是因为

ps -ef | grep python

会返回一些 pid ,这样的话, kill 又具备可以连续杀死进程的特征,所以,可以一直执行。

我运行上面的例子,会返回

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
kill: kill 501 failed: no such process
kill: illegal pid: 9:37下午
kill: illegal pid: ??
kill: illegal pid: 0:01.83
kill: illegal pid: /Users/licong/anaconda3/bin/python
kill: illegal pid: /Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd.py
kill: illegal pid: --multiproc
kill: illegal pid: --qt-support=auto
kill: illegal pid: --client
kill: illegal pid: 127.0.0.1
kill: illegal pid: --port
kill: kill 64264 failed: no such process
kill: illegal pid: --file
kill: illegal pid: /Users/licong/python/eosvoter/main.py
kill: kill 501 failed: no such process
kill: illegal pid: 9:37下午
kill: illegal pid: ??
kill: illegal pid: 0:02.18
kill: illegal pid: /Users/licong/anaconda3/bin/python
kill: illegal pid: /Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd.py
kill: illegal pid: --port
kill: kill 64264 failed: no such process
kill: illegal pid: --client
kill: illegal pid: 127.0.0.1
kill: illegal pid: --multiproc
kill: illegal pid: --file
kill: illegal pid: /Users/licong/python/eosvoter/main.py
kill: kill 501 failed: no such process
kill: kill 48254 failed: no such process
kill: kill 48252 failed: no such process
kill: illegal pid: 9:37下午
kill: illegal pid: ttys003
kill: illegal pid: 0:00.00
kill: illegal pid: grep
kill: illegal pid: python

ps


ps 命令有多种不同的使用方法,这常常给初学者带来困惑。在各种 Linux 论坛上,询问 ps 命令语法的帖子屡见不鲜,而出现这样的情况,还要归咎于 UNIX悠久的历史和庞大的派系。在不同的 Linux 发行版上,ps 命令的语法各不相同,为此,Linux 采取了一个折中的方法,即融合各种不同的风格,兼顾那些已经习惯了其它系统上使用 ps 命令的用户。

由于,ps 的流派实在是太多了,所以在这里只给出一些常用的参数和用法。

另外,有的 ps 的命令可以加 - 有的不可以加,在各种博文中也说的不同,就是因为流派实在是太多。

ps aux

查看系统中所有的进程,使用 BS 操作系统格式

  • a:显示一个终端的所有进程,除会话引线外;
    • 这里终端的意思不是,不是单独的指你的单独 shell 窗口,我觉得是你开了电脑后,你所使用的这个电脑被称为一个终端,这个终端所有运行的进程
  • u:显示进程的归属用户及内存的使用情况;
  • x:显示没有控制终端的进程;

ps: ps 命令有些与众不同,它的部分选项不能加入"-",比如命令"ps aux",其中"aux"是选项,但是前面不能带“-”

1
2
3
4
[root@localhost ~]# ps aux
#查看系统中所有的进程
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 2872 1416 ? Ss Jun04 0:02 /sbin/init
表头 含义
USER 该进程是由哪个用户产生的。
PID 进程的 ID。
%CPU 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。
%MEM 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。
VSZ 该进程占用虚拟内存的大小,单位为 KB。
RSS 该进程占用实际物理内存的大小,单位为 KB。
TTY 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255
STAT 进程状态。常见的状态有以下几种:
-D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
-R:该进程正在运行。
-S:该进程处于睡眠状态,可被唤醒。
-T:停止状态,可能是在后台暂停或进程处于除错状态。
-W:内存交互状态(从 2.6 内核开始无效)。
-X:死掉的进程(应该不会出现)。
-Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。
-<:高优先级(以下状态在 BSD 格式中出现)。
-N:低优先级。
-L:被锁入内存。
-s:包含子进程。
-l:多线程(小写 L)。
-+:位于后台。
START 该进程的启动时间。
TIME 该进程占用 CPU 的运算时间,注意不是系统时间。
COMMAND 产生此进程的命令名。

ps -le

-A-e 是一个作用,不过 -e 好记。

  • -l:长格式显示更加详细的信息;
  • -e:显示所有进程;

ax 等价于 -e

ps aux 命令可以看到系统中所有的进程,ps -le命令也能看到系统中所有的进程。由于 -l 选项的作用,所以 ps -le 命令能够看到更加详细的信息,比如父进程的 PID、优先级等。但是这两个命令的基本作用是一致的,掌握其中一个就足够了。

有的时候还会加上 -f,这个选项是输出更多的信息,还不如 -l

1
2
3
[root@localhost ~]# ps -le
F S UID PID PPID C PRI Nl ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 718 - ? 00:00:02 init
表头 含义
F 进程标志,说明进程的权限,常见的标志有两个:
1:进程可以被复制,但是不能被执行;
4:进程使用超级用户权限;
S 进程状态。具体的状态和”psaux”命令中的 STAT 状态一致;
UID 运行此进程的用户的 ID;
PID 进程的 ID;
PPID 父进程的 ID;
C 该进程的 CPU 使用率,单位是百分比;
PRI 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;
NI 进程的优先级,数值越小,该进程越早被执行;
ADDR 该进程在内存的哪个位置;
SZ 该进程占用多大内存;
WCHAN 该进程是否运行。”-“代表正在运行;
TTY 该进程由哪个终端产生;
TIME 该进程占用 CPU 的运算时间,注意不是系统时间;
CMD 产生此进程的命令名;

ps -l

只能看到当前登录产生的进程;

如果不想看到所有的进程,只想查看一下当前登录产生了哪些进程,那只需使用 ps -l 命令就足够了:

1
2
3
4
5
[root@localhost ~]# ps -l
#查看当前登录产生的进程
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 18618 18614 0 80 0 - 1681 - pts/1 00:00:00 bash
4 R 0 18683 18618 4 80 0 - 1619 - pts/1 00:00:00 ps

僵尸进程。僵尸进程的产生一般是由于进程非正常停止或程序编写错误,导致子进程先于父进程结束,而父进程又没有正确地回收子进程,从而造成子进程一直存在于内存当中,这就是僵尸进程。

僵尸进程会对主机的稳定性产生影响,所以,在产生僵尸进程后,一定要对产生僵尸进程的软件进行优化,避免一直产生僵尸进程;对于已经产生的僵尸进程,可以在查找出来之后强制中止。

请我喝杯咖啡吧~