Linux是一个很棒操作系统,但是还不完美。有时,某些应用程序可能会开始出现异常行为,并变得无响应或开始消耗大量系统资源。
无响应的应用程序将无法重新启动,因为原始应用程序进程永远不会被关闭。唯一的解决方案是重新启动系统或终止应用程序进程。
有几个命令可让您终止错误的进程,我们最常使用的命令是kill
。在本教程中我们将说明如何使用kill命令。
kill命令
kill
是Bourne shell内置的命令,例如Bash和Zsh。Shell内置的Kill命令和独立可执行文件/bin/kill
的Kill命令行为略有不同。
当你运行命令type命令显示系统kill
命令所有位置信息时。你会发现内置在shell的Kill命令,优先于独立可执行文件的kill。
如果要使用二进制文件的Kill命令,请在终端键入完整路径/bin/kill
运行kill命令。在本教程中,我们说明内置在Bash的kill
命令。
type -a kill
kill is a shell builtin
kill is /bin/kill
kill
命令的语法形式是kill [OPTIONS] [PID]...
。OPTIONS
是Kill命令的选项,PID
是进程的PID。
kill
命令可将信号发送到指定的进程或进程组。并根据信号执行指定操作。如果未指定信号时,默认发送信号-15
/-TERM,即终止信号。
最常用的信号是1
/HUP
重新加载进程。9
/KILL
终止进程。15
/TERM
平滑地终止进程。
要获取所有可用信号的列表,请使用-l
选项运行kill命令。
kill -l
可以用三种不同的方式指定信号,第一种使用数字,例如-1
或-s 1
。第二种是使用SIG前缀的信号名称,例如-SIGHUP
或-s SIGHUP
。
第三种是没有SIG前缀的信号名称,例如-HUP
或-s HUP
。例如以下三个命令是等价的命令。
kill -1 PID_NUMBER
kill -SIGHUP PID_NUMBER
kill -HUP PID_NUMBER
传递给kill
命令的PID可以是这些之一。如果PID
大于零,则将信号发送到指定进程。
如果PID
等于零,则发送信号到当前进程组的所有进程。可以运行ps -efj
命令查看进程组GID。
如果PID
等于-1
,则将信号以运行kill命令的用户发送到所有进程。如果运行kill命令的用户是root用户,则将信号发送到所有进程,除开init
进程和kill
进程本身。
如果PID
小于-1
,则将信号发送给进程GID中所有的进程,进程组GID是PID
的绝对值。
普通用户可以向自己的进程发送信号,但不能向属于其他用户的进程发送信号,而root根用户可以向所有用户的进程发送信号。
kill 命令终止进程
要使用kill
命令终止进程,首先需要找到进程的ID号,也就是进程PID。在Linux有很多命令帮助你找到进程PID,例如top
,ps
,pidof
和pgrep
。
假设Firefox浏览器已无响应,此时您需要终止Firefox进程。首先需要找到Firefox浏览器进程PID。
在本教程中,我们使用pidof
命令查找Firefox浏览器进程PID,运行命令pidof firefox
。命令将显示Firefox浏览器所有进程的PID。
当找到进程PID,就可以运行kill命令发送TERM
信号终止进程。运行命令kill -9 2551 2514 1963 1856 1771
。
您可以将pidof firefox
命令和kill命令组合为一个命令,这样就可以不用先搜索进程PID,然后再终止进程。
pidof firefox
kill -9 2551 2514 1963 1856 1771
kill -9 $(pidof firefox)
Kill 命令重新加载进程
kill
的另一个常见用例是发送HUP
信号,该信号指示进程进程重新加载其配置文件。
例如,要重新加载Nginx配置文件,您需要向Nginx主进程发送HUP
信号。Nginx主进程的进程ID可以在nginx.pid
文件中找到,该文件通常位于/var/run
目录中。
可以运行cat命令cat /var/run/nginx.pid
查看Nginx主进程PID。找到PID后,运行命令sudo kill -1 nginx_pid
重新加载Nginx设置。
同样你可以组合两个命令为一个命令,注意Nginx主进程重新加载以root或具有sudo权限的用户运行。
sudo kill -1 $(cat /var/run/nginx.pid)
结论
kill
命令用于向进程发送信号。最常用的信号是SIGKILL
或-9
,它会终止指定的进程。如果您有任何问题或反馈,请随时发表评论。