linux命令行杀死进程
在 Linux 操作系统中运行的一切都被视为一个进程。当用户执行程序或Linux操作系统自己运行系统服务时,会创建一个新进程。通常,进程将在完成任务后终止,或者用户通过使用鼠标单击“关闭”或按键盘上的“Ctrl +C”来强制终止进程。然而,当进程挂起并占用几乎所有系统资源(如 CPU 或 RAM)时,我们可能会遇到意外行为。为了释放资源,我们必须手动终止或“杀死”该进程。
Kill 命令的机制
命令“kill”的名称告诉我们它用于立即停止 Linux 系统上的进程。“kill”命令将尝试尽可能优雅地结束您想要杀死的进程。
‘Kill’ 命令向进程发送一个指定的信号。信号可以是 SIGTERM(终止)或 SIGKILL(终止信号)。SIGTERM 信号的数值为 15,SIGKILL 信号的数值为 9。
默认情况下,发送 SIGTERM 信号是终止进程的最安全方法。它指示进程终止并让程序或服务有时间在关闭之前完成处理,例如写入日志文件或关闭由进程创建的打开的连接。
另一方面,SIGKILL 信号是杀死进程的不安全方法,因为它结束进程而不保存任何内容。
当用户想要杀死顽固运行的进程时,SIGKILL 信号非常有效。
找到正在运行的进程
Linux 系统中的每个进程都是程序的一个实例。每次,操作系统启动一个程序,都会为其分配一个唯一的 PID – 代表进程ID标识号。
因此,在 Linux 系统中不可能有两个进程具有相同的 PID,因为操作系统使用进程 ID 来跟踪每个进程。为了杀死一个进程,我们应该首先通过运行“ps command”、“top”、“pidof”或“pgrep”来指定进程的详细信息。当您通过其 PID 终止进程时,只会终止特定进程。而通过名称杀死进程将终止程序的所有正在运行的进程。
通过 PID 杀死一个进程
要查看所有正在运行的进程和相应 pid 的列表,请使用“ps 命令”:
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 159904 7152 ? Ss Thg 611 0:10 /sbin/init splash
root 2 0.0 0.0 0 0 ? S Thg 611 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< Thg 611 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< Thg 611 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< Thg 611 0:00 [kworker/0:0H-kb]
root 9 0.0 0.0 0 0 ? I< Thg 611 0:00 [mm_percpu_wq]
root 10 0.0 0.0 0 0 ? S Thg 611 0:02 [ksoftirqd/0]
root 11 0.0 0.0 0 0 ? I Thg 611 2:48 [rcu_sched]
root 12 0.0 0.0 0 0 ? S Thg 611 0:00 [migration/0]
root 13 0.0 0.0 0 0 ? S Thg 611 0:00 [idle_inject/0]
root 14 0.0 0.0 0 0 ? S Thg 611 0:00 [cpuhp/0]
root 15 0.0 0.0 0 0 ? S Thg 611 0:00 [cpuhp/1]
root 16 0.0 0.0 0 0 ? S Thg 611 0:00 [idle_inject/1]
root 17 0.0 0.0 0 0 ? S Thg 611 0:01 [migration/1]
root 18 0.0 0.0 0 0 ? S Thg 611 0:00 [ksoftirqd/1]
root 20 0.0 0.0 0 0 ? I< Thg 611 0:00 [kworker/1:0H-kb]
root 21 0.0 0.0 0 0 ? S Thg 611 0:00 [kdevtmpfs]
root 22 0.0 0.0 0 0 ? I< Thg 611 0:00 [netns]
root 23 0.0 0.0 0 0 ? S Thg 611 0:00 [rcu_tasks_kthre]
root 24 0.0 0.0 0 0 ? S Thg 611 0:00 [kauditd]
...
ps aux 命令输出
确定进程 ID 后,您可以使用带有其 pid 的“kill”命令终止该进程。例如:
$ sudo kill
上面的命令向进程发送一个 SIGTERM 信号并终止它。您可以通过运行以下命令验证进程是否已成功关闭:
$ ps aux | grep
需要注意的一些重要事项:
- 用户可以杀死其所有进程
- 一个用户不能杀死其他用户的进程
- 用户无法杀死系统正在运行的进程
- Root可以杀死系统的进程和任何用户的进程
您可以使用“sudo”运行 kill 命令,以“root”身份终止进程。
查看正在运行的进程列表的另一种方法是使用“top”命令:
$ top
top - 16:50:31 up 3 days, 53 min, 1 user, load average: 0,00, 0,00, 0,00
Tasks: 257 total, 1 running, 186 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0,2 us, 0,3 sy, 0,0 ni, 99,5 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
KiB Mem : 2006008 total, 1209480 free, 443172 used, 353356 buff/cache
KiB Swap: 969960 total, 922100 free, 47860 used. 1403360 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11 root 20 0 0 0 0 I 0,3 0,0 2:48.96 rcu_sched
1 root 20 0 159904 7152 5400 S 0,0 0,4 0:10.25 systemd
2 root 20 0 0 0 0 S 0,0 0,0 0:00.03 kthreadd
3 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 kworker/0:0H-kb
9 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 mm_percpu_wq
10 root 20 0 0 0 0 S 0,0 0,0 0:02.56 ksoftirqd/0
12 root rt 0 0 0 0 S 0,0 0,0 0:00.89 migration/0
13 root -51 0 0 0 0 S 0,0 0,0 0:00.00 idle_inject/0
14 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/0
15 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/1
16 root -51 0 0 0 0 S 0,0 0,0 0:00.00 idle_inject/1
17 root rt 0 0 0 0 S 0,0 0,0 0:01.09 migration/1
18 root 20 0 0 0 0 S 0,0 0,0 0:00.94 ksoftirqd/1
20 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 kworker/1:0H-kb
正如您在top 命令的输出中看到的那样,进程的 PID 在左侧列中,相应程序的名称在右侧。
此外,如果您想获取您知道其名称的进程的 PID,请运行以下命令行:
$ pidof
例如,为了获得一个进程的 PID,其名称为“netns”:
$ pidof netns
22
更重要的是,如果您不知道进程的确切名称,可以运行命令“pgrep”。例如,要搜索所有包含“netn”的进程,请运行以下命令:
$ pgrep netn
22
有时,您可能会遇到挂起并拒绝终止的进程,您可以通过发送带有选项 -9 的 SIGKILL 信号来终止该进程
$ sudo kill -9
按名称杀死进程
本节将解释使用进程名称杀死进程的方法。我们可以使用许多命令来按进程名称杀死进程,例如:'killall' 和 'pkill'。
如果您知道确切的进程名称,请使用killall 命令杀死进程运行命令行:
$ killall
例如,杀死一个名为“nginx”的进程,运行命令行:
$ killall nginx
如果你想强行杀死一个进程,发送 SIGKILL 信号给这个进程:
$ killall -9 nginx
还有一些使用“killall”命令的其他场景。例如:
杀死已经运行超过 10 分钟的进程,运行命令行:
$ killall -o 10m
杀死一个运行不到 10 分钟的进程,运行:
$ killall -y 10m
有时,您不知道程序的确切名称,您只知道名称的一部分,您可以使用pkill命令杀死该进程。这是一个例子:
$ pkill ssh
如果还有其他一些名为 ssh-server'
或 ssh-agent
的进程,上面的命令 pkill
也会杀死它们。
使用举例
通常我们会使用一下方式来kill掉一个进程
$ ps -ef | grep nginx
$ kill -9 PID