Linux中的Kill命令
Linux是一个伟大而先进的操作系统,但它并不完美。偶尔,某些应用程序可能会开始表现不稳定并变得无响应或开始消耗大量系统资源。没有反应的应用程序不能被重新启动,因为原来的应用程序进程从未完全关闭。唯一的解决办法是重新启动系统或终止应用程序进程。
有几个工具可以让你终止错误的进程,其中kill
是最常用的工具。
kill
命令
kill
是大多数Bourne派生的shell中的一个内置程序,如Bash和Zsh。命令行为在shell和独立的/bin/kill
可执行文件之间略有不同。
使用type
命令来显示你的系统中所有包含kill
的位置:
type -a kill
输出
kill is a shell builtin
kill is /bin/kill
上面的输出告诉我们,shell内置程序比独立的可执行文件有优先权,只要你输入kill
就会使用它。如果你想使用二进制文件,请输入文件的完整路径/bin/kill
。在本文中,我们将使用Bash内置程序。
kill
命令的语法有如下形式:
kill [OPTIONS] [PID]...
kill
命令向指定的进程或进程组发送一个信号,使它们根据该信号采取行动。当没有指定信号时,它默认为-15
(-TERM)。
最常使用的信号是::
1
(HUP
) - 重新加载一个进程。9
(KILL
) - 杀死一个进程。15
(TERM
) - 优雅地停止一个进程。
要获得所有可用信号的列表,请用-l
选项调用该命令:
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
大于0,信号将被发送到ID等于PID
的进程中。 - 如果
PID
等于0,信号将被发送到当前进程组的所有进程。换句话说,信号被发送到属于调用kill
命令的shell的GID的所有进程。使用ps -efj
命令可以查看进程组ID(GID)。 - 如果
PID
等于-1
,信号将被发送到与调用命令的用户具有相同UID的所有进程。如果调用的用户是root,信号将被发送到所有进程,除了init和kill
进程本身。 - 如果
PID
小于-1
,该信号将被发送到进程组eq中的所有进程,其GID等于PID
的绝对值。
普通用户可以向自己的进程发送信号,但不能向属于其他用户的进程发送信号,而根用户则可以向其他用户的进程发送信号。
使用kill
命令终止进程
要用kill
命令终止或杀死一个进程,首先你需要找到进程的ID号(PID)。你可以用不同的命令来做,如top
、ps
、pidof
和pgrep
。
假设Firefox浏览器变得没有反应,而你需要杀死Firefox进程。要找到浏览器的PID,请使用pidof
命令:
pidof firefox
该命令将打印出所有Firefox进程的ID:
输出
6263 6199 6142 6076
一旦你知道了这些进程的编号,你就可以通过发送TERM
信号来杀死所有的进程:
kill -9 6263 6199 6142 6076
与其搜索PID然后杀死进程,你可以将上述命令合二为一:
kill -9 $(pidof firefox)
使用kill
命令的重新加载进程
kill
的另一个常见的用例是发送HUP
信号,它告诉进程重新加载其设置。
例如,为了重新加载Nginx,你需要向主进程发送一个信号。Nginx主进程的进程ID可以在nginx.pid
文件中找到,该文件通常位于/var/run
目录中。
使用cat
命令来查找主PID:
cat /var/run/nginx.pid
输出
30251
一旦你找到了主PID,就可以通过键入来重新加载Nginx的设置:
sudo kill -1 30251
上述命令必须以根用户或具有sudo权限的用户的身份运行。
总结
kill
命令是用来向进程发送信号的。最经常使用的信号是SIGKILL
或-9
,它可以终止指定的进程。
如果你有任何问题或反馈意见,请随时留言。