如何使用 kill 和 killall 强制终止 Linux 中的进程
您需要在 Linux 操作系统上使用kill 命令或killall 命令来终止进程,而无需注销或重新启动服务器。本页向您展示如何在 Linux 中强制终止进程。
如何在 Linux 中强制终止进程
- 使用 pidof 命令查找正在运行的程序或应用的进程 ID
pidof appname - 要立即在 Linux 中使用 PID 终止进程:
kill -9 pid - 想要强制杀死 Linux 中带有应用程序名称的进程?尝试:
killall -9 appname - 您可以向进程发送 -15(SIGTERM)信号,请求其正常终止:
killall -15 your-app-name
并且
kill -15 pid
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 终端 |
类别 | 流程 |
操作系统兼容性 | Alma • Alpine • Arch • CentOS • Debian • Fedora • Linux • Mint • openSUSE • Pop!_OS • RHEL • Rocky • Stream • SUSE • Ubuntu • WSL |
预计阅读时间 | 7 分钟 |
SIGTERM (-15) 与 SIGKILL (-9) 信号
SIGTERM (-15) 与 SIGKILL (-9) 重新发出信号在 Linux、macOS、FreeBSD/OpenBSD/NetBSD 和类 Unix 系统中终止进程。
如何在 Linux 中终止进程
让我们尝试终止一个名为 firefox 的进程。要查找 firefox pid,请运行以下任一命令:
$ pidof firefox
$ pgrep firefox
$ ps aux | grep firefox
在 Linux 上查找要终止的进程 (PID)
在 Linux 命令行上强制终止进程
要在 Linux 上终止进程,请使用kill 命令:
默认情况下,将发送名为 SIGTERM 的第 15 个信号来终止进程。因此,以下所有命令都在执行相同的操作:使用pidof /pgrep 命令或 ps 命令和grep 命令的组合来定位正在运行的 Linux 进程,
以验证 Firefox 进程是否已消失。例如:
有许多信号可以与 kill 一起使用,但大多数用户只需要注意信号 9 和 15。要获取完整列表,请运行:
示例输出:
$ kill pid
$ kill -SIGKILL pid
$ kill 27707
$ kill -15 27707
$ kill -SIGTERM 27707
$ kill 27707
$ pidof firefox
$ pgrep firefox
$ ps aux | grep firefox
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
如何使用 SIGKILL 在 Linux 中终止进程
有时 -SIGTERM(-15)会失效,这时应使用更强的信号 9(称为 SIGKILL)来强制终止进程。例如,以下命令将确保终止进程 27707:
$ kill -9 27707
$ kill -SIGKILL 27707
Linux 使用 killall 命令强制终止进程
除了使用 PID,还可以使用killall或 pkill 命令按名称终止任何进程。语法如下:
killall 命令向运行任何指定命令的所有进程发送信号。例如,强制终止所有 nginx 进程,运行:
您可能希望以 root 用户身份运行killall 命令以终止 Linux 上所有用户的进程:
也可以通过确认终止进程:
$ killall -9 app
$ pkill -9 app
$ killall -9 nginx
$ sudo killall -9 nginx
$ killall -9 vim
如何终止超过 TIME 时间的进程
想要终止已运行超过 24 小时的名为 vim 的进程?尝试:将
时间指定为浮点数,然后指定为单位。
$ killall -o 24h appName
$ killall -o 24h vim
意义 | 单元 |
---|---|
s | 秒 |
米 | 分钟 |
时长 | 小时 |
d | 天 |
瓦 | 周 |
米 | 月份 |
是 | 年 |
如何杀死比 TIME 更年轻的进程
让我们终止一个运行时间少于 60 分钟的进程:
$ killall -y 60 -9 appName
$ killall -y 60 -9 firefox
如何仅终止以 USER 身份运行的进程
假设你想终止以 vivek 用户身份运行的 vim 进程,请运行:
$ killall -u {user} -9 vim
$ killall -u vim -9 vim
关于SIGHUP(-1)信号的说明
您可能会看到一些 SIGHUP (-1) 信号的示例。例如:
SIGHUP (HUP 或 -1) 信号通知进程其控制终端已断开连接。但是,根据上下文,进程可以捕获信号并执行自定义操作。以下是您可能希望发送 SIGHUP 而不是 SIGTERM 或 SIGKILL 的一些示例:
$ sudo kill -1 pid
$ sudo kill -HUP $(cat /var/run/SERVICE.pid)
- 假设您想要重新加载系统服务。例如,在更新配置文件后重新加载 sshd 服务,并在不终止 sshd 服务的情况下加载新更改。因此您写入:
在系统日志文件中,您将立即看到以下条目。例如,我们可以使用grep 命令或 tail 命令在 Debian/Ubuntu Linux 下查看/var/log/auth.log :输出:
$ sudo kill -1 $(cat /var/run/sshd.pid)
## OR ##
$ sudo kill -SIGHUP $(cat /var/run/sshd.pid)
$ tail -f /var/log/auth.log
$ tail -f /var/log/auth.log | grep -i SIGHUP
Mar 25 13:56:37 wks01 sshd[1555]: Received SIGHUP; restarting. Mar 25 13:56:37 wks01 sshd[1555]: Server listening on 0.0.0.0 port 22. Mar 25 13:56:37 wks01 sshd[1555]: Server listening on :: port 22.
- 某些进程在收到 SIGHUP 信号时可以中断正在运行的进程并强制其转储当前状态以进行调试。
- 我们还可以向远程进程发送 SIGHUP,通知它网络连接已关闭或丢失。
- 另一种用法是向进程组中的所有进程发送 SIGHUP,以通知它们发生更改。例如,Nginx 或 PHP-FPM 进程以父/子或主/次模型工作。因此,您可以使用 SIGHUP 终止父进程或主进程。
- 简而言之,SIGHUP 是一种信号,可用于通知 Linux/Unix 进程重大事件或更改,例如您对配置文件进行了更改。有些服务会处理 SIGHUP,而其他服务则会忽略它。因此,这一切都取决于上下文;因此,您需要处理文档以了解它们如何处理 SIGHUP。
结论
本页介绍了如何在 Linux 操作系统上使用 kill 和 killall 命令强制终止进程。如表 1所示,SIGTERM 是一种要求进程终止的更温和的方式,而 SIGKILL 是一种终止不响应其他信号的进程的更强制的方式。因此,请首先尝试 SIGTERM,如果有必要,则只在最后才使用 SIGKILL。kill/killall 命令有更多选项。因此,请使用 Linux 终端会话按如下方式使用 help 命令或 man 命令阅读手册页:
$ man kill
$ man killall
$ man ps
$ man pgrep