Ubuntu下关闭指定程序进程


前言

有时候我们需要通过命令行关闭特定进程,对于指定进程号的关闭很容易,但是如果需要关闭指定的程序或者关闭指定路径下的程序则变得不那么容易,下面我们将会对此进行讨论。另外,很多方式都会有权限限制,所以可以适时采用sudo方式执行。

1.进程资源监控

1.1 gnome-system-monitor

gnome-system-monitor是Ubuntu系统自带的资源管理器,可以让我们在界面中动态查看所有进程资源以及计算内存消耗情况,可直接在命令行中输入gnome-system-monitor

1548515584058

1548515605903

1548515617181

可以看见,以上内容能够很容易帮我们监控系统资源,但是如果我们需要将监控级别设定到指定程序级别,则需要对该界面进行相关配置:

  • 左上角显示设置

    我们可以通过左上角的按钮查询指定程序的进程号,也可以显示出每一个进程的执行命令行信息:

    1548515819111

    1548515869298

  • 右上角筛选设置

    默认显示的是当前用户所有的进程信息,但如果想知道当前活跃的进程信息,并显示父子进程的依赖关系,我们可以通过右上角按钮选择:

    1548515955559

1.2 top

top也是Ubuntu系统自带的一个系统资源监控指令,同样是在命令行执行:

1548516050502

其中上方的%Cpu的意义如下:

1
2
3
4
5
6
7
us — 用户空间占用CPU的百分比。
sy — 内核空间占用CPU的百分比。
ni — 改变过优先级的进程占用CPU的百分比
id — 空闲CPU百分比
wa — IO等待占用CPU的百分比
hi — 硬中断(Hardware IRQ)占用CPU的百分比
si — 软中断(Software Interrupts)占用CPU的百分比

而下方的则是各个进程的详细信息,其中要注意的是:

1
2
3
4
5
6
7
8
9
10
PID: 进程号
USER: 进程所有者
PR: 进程优先级
VIRT: 进程所占虚拟内存大小,单位:B
RES: 进程所占物理内存大小,单位:B
SHR: 进程所占共享内存大小,单位:B
%CPU: 进程所占CPU使用率
%MEM:进程所占内存使用率
TIME+: 进程启动后所占总的CPU时间
COMMAND: 进程命令名

特别的,键盘按下1会显示所有核的信息,按下q会退出当前窗口。

1.3 htop

htop相对top来说,是一个更加清晰的系统资源监控器,不过需要先安装:

1
sudo apt install htop

同样在命令行执行:

1548516682654

2.利用进程号关闭进程

指定进程号,如果要关闭其对应进程,只需要执行:

1
2
kill 进程号
kill -15 进程号

以上两种方式会关闭正在执行的进程,不过依然会有部分程序会延时相应,或者不相应,所以我们可以强制关闭:

1
kill -9 进程号

进程号一定要填,不然默认关闭所有进程,包括我们的系统进程。

3.利用程序名关闭进程

3.1 直接关闭

Ubuntu提供了直接关闭进程的指令killallpkill

1
2
killall 进程名
pkill 进程名

不过这两个方法有三个缺点:

  • 进程名指的是执行命令的名称,并不是命令行,即:

    1
    python test.py =>python
  • 进程名如果超过15个字符会自动截断:

    1
    2
    killall bt_uinfo_memcached x
    killall bt_uinfo_memcac √
  • 对于图形界面等关闭不了,因为属于tty,不属于command。

3.2 先查找再关闭

  • 我们在第一章介绍gnome-system-monitor时,提到其自带查找进程号的功能,即search for open files;

  • Ubuntu提供了一种简单完全匹配工具pidof:

    1
    pidof 进程名

    注意这里的进程名必须是完整的名称,如:python

  • Ubuntu还提供了命令行工具进行查找:

    1
    2
    ps -e | grep 进程名
    ps -ef | grep 进程名

    1548518549579

    1548518423771

我们可以看到,仅仅-e所能匹配的进程不全,但是-ef能匹配更详细的命令行信息,更重要的是这种方式不是完整匹配,而是部分匹配。

  • 对于ps -e,Ubuntu提供了更简洁的用法:

    1
    2
    pgrep 进程名
    pgrep -a 进程名

    1548518865856

    1548518904099

    pgrep的缺点在于,无法实现ps -ef的命令行匹配功能,其优点在于可以只打印进程号,方便后续关闭。

  • 我们如果既想拥有pgrep那样直接打印进程号的简洁,又想拥有ps -ef |grep方式匹配完整命令行的强大,可以利用awk语言编程实现,利用进程号在第二列的特性:

    1
    ps -ef | grep 进程信息 |awk '{print $2}'

    1548519375467

有了这些进程的查找方式,那么关闭进程就很容易了,那么,如果我们想要一次性执行查找和关闭怎么办?可以利用xargs命令,下面为了保证权限问题,都加入了sudo

1
2
3
pidof python |xargs sudo kill -9
pgrep python |xags sudo kill -9
ps -ef |grep python |awk '{print $2}'|xargs sudo kill -9

4.利用python关闭进程

4.1 os系统指令

python自身可以利用os模块的system功能执行命令行指令,如:

1
os.system('kill -9 进程号')

另外Python也可以获取自身程序的进程号:

1
os.getpid()

4.2 psutil库

psutil库能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息,它主要用来做系统监控,性能分析,进程管理。其安装方式如下:

1
pip install psutil

这里我不介绍其详细功能,只介绍如何利用其关闭特定进程。

  • 获取当前系统所有进程:

    1
    psutil.pids()

    返回所有进程号列表。

  • 获取每个进程的详细信息:

    1
    psutil.Process(进程号)

    1548520601287

    返回的是该进程所对应的类,通过观察其属性可见,有很多信息可以利用:

    1548521312890

那么我们可以这样进行匹配,假如我们要关闭包含train字样的python进程,那么可以:

1
2
3
4
5
6
7
8
9
import psutil
import os
for i in psutil.pids():
try:
p = psutil.Process(i)
if p.name() == 'python' and 'train' in ''.join(p.cmdline()):
os.system('kill -9 '+str(i))
except Exception:
pass

之所以要加入保护,是因为进程随时都处于启动和关闭状态,有的进程可能在处理过程中关闭了。


-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!