linux命令行杀死进程

在 Linux 操作系统中运行的一切都被视为一个进程。当用户执行程序或Linux操作系统自己运行系统服务时,会创建一个新进程。通常,进程将在完成任务后终止,或者用户通过使用鼠标单击“关闭”或按键盘上的“Ctrl +C”来强制终止进程。然而,当进程挂起并占用几乎所有系统资源(如 CPU 或 RAM)时,我们可能会遇到意外行为。为了释放资源,我们必须手动终止或“杀死”该进程。
从linux终端杀死一个进程

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 辅助命令
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命令

正如您在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
linux tar命令详解+示例
Linux中crontab的用法和配置

发表我的评论

电子邮件地址不会被公开。 必填项已用*标注

47 + 34 =

ajax-loader