如何从命令行终止 Linux 进程?

1. 写在前面

Linux 中,杀死进程指的是终止或停止一个正在运行的程序。每个运行中的进程都会被分配一个唯一的标识号,即进程 ID(PID),它有助于系统跟踪当前的活动进程。

在本文中,我们将介绍 Linux kill 进程,以及如何使用 Linux 中不同工具和命令查找并终止进程。

2. 什么是 Linux 进程?

简单来说,进程就像是系统中正在运行的程序,每个进程都有自己的特殊 ID(PID)编号。然而,有时一个正在运行的程序或进程可能会执行错误,或停止响应,或占用过多的系统资源。

当这种情况发生时,我们需要停止或 “kill” 进程。

3. 什么是 “kill” 命令?

“kill” 命令允许用户向当前运行的进程发送信号(停止或终止),指示它们优雅地退出或强制终止。当需要管理和控制 Linux 系统中不同程序的活动时,”kill” 命令非常有用,例如:

  • 停止任何自动启动的进程;

  • 停止意外启动的进程;

  • 停止占用过多内存的进程;

  • 强制终止 Linux 中任何正在运行的进程;

  • 停止后台运行的进程;

4. 如何查找进程 ID 或进程名称?

在终止一个正在运行的进程之前,必须使用以下 “ps” 命令确定其进程 ID(PID)或名称,该命令可显示系统中所有正在运行的进程 PID(进程 ID)和其他信息。

root@dev:~# ps -ef
--------------------------------------------------------------------------------------
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2023 ? 00:01:53 /sbin/init
root 2 0 0 2023 ? 00:00:02 [kthreadd]
root 4 2 0 2023 ? 00:00:00 [kworker/0:0H]
root 6 2 0 2023 ? 00:00:00 [mm_percpu_wq]
root 7 2 0 2023 ? 00:01:11 [ksoftirqd/0]

如果要查找特定的进程名称 PID,可以使用 “grep” 命令列出系统上运行的所有进程,并对结果进行过滤,只显示包含 “nginx” 的进程。

root@dev:~# ps -ef | grep  nginx
--------------------------------------------------------------------------------------
root 26400 1 0 15:57 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 26404 26400 0 15:57 ? 00:00:00 nginx: worker process
www-data 26405 26400 0 15:57 ? 00:00:00 nginx: worker process
root 26412 26369 0 15:57 pts/0 00:00:00 grep --color=auto nginx

另外,也可以使用 “pgrep” 命令直接按名称查找进程的 PID,如图所示:

root@dev:~# pgrep nginx
--------------------------------------------------------------------------------------
26400
26404
26405

5. 如何在 Linux 中杀死进程?

在杀死、停止或终止进程之前,请先考虑一下权限问题。如果是 root 用户,可以停止任何进程,但如果是普通用户,需要在命令前加上 “sudo”,或用 “su “切换成 root 用户才能使用终止命令。

kill 命令的常用语法是:

kill [signal or option] PID(s)
OR
sudo kill [signal or option] PID(s)

“kill” 命令 “signal”:


如何从命令行终止 Linux 进程?

  • SIGTERM: “kill” 进程默认和最安全的方法;

  • SIGHUP: 比 “SIGTERM” 更不安全杀死进程的方法;

  • SIGKILL: 上述三种方法中最不安全的一种,可以在不保存进程状态下杀死终止进程;

在 Linux 中,可以使用不同的信号来停止、结束或暂停进程。可以使用以下命令列出所有可用的 “kill” 信号及其名称和相应的编号;

root@dev:~# 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 (9) 和 SIGTERM (15)。

要杀死一个进程,需要知道该进程的进程 ID。进程是程序的一个实例,每次程序启动时,都会自动为该进程生成一个唯一的 PID。

Linux 中的每个进程都有一个 PID。Linux 系统启动时启动的第一个进程是 init 进程,因此在大多数情况下它的 PID 值都是 “1”。

init 是主进程,不能以这种方式被杀死,这样可以确保主进程不会被意外杀死。init 决定并允许自己被杀死,而 “kill” 只是一个关闭请求。

在执行 “kill” 命令之前,需要注意一些要点:

  • 普通用户可以杀死他自己的所有进程;

  • 普通用户不能杀死其他用户的进程;

  • 普通用户无法杀死系统正在使用的进程;

  • root 用户可以杀死系统级进程和任何用户的进程;


要杀死 nginx 进程,如下所示:

root@dev:~# kill -9 26400
root@dev:~# ps -ef | grep nginx
root 26427 26369 0 16:14 pts/0 00:00:00 grep --color=auto nginx

上述命令将杀死 pid=26400 的进程(nginx)。

同样,”kill -9 PID” 类似于 “kill -SIGKILL PID”,反之亦然。

要确认进程已终止,可以再次使用 “ps” 命令。

6. 如何在 Linux 中杀死多个进程?

要在 Linux 中使用进程 ID(PID)终止多个进程,可以结合使用 kill 命令和相关的 PID 号。

首先,使用 “ps” 或 “pgrep” 命令确定要终止的进程的 PID。

ps aux | grep apache2
OR
pgrep apache2

获得 PID 后,使用 “kill” 命令终止它们。

kill -9 PID1 PID2 PID3

7. 如何在 Linux 中使用进程名称杀死进程?

要使用进程名终止进程,可以使用 “pkill” 命令,它是 “kill” 命令的一个版本,允许通过进程名来定位进程。

在 “kill” 进程前,必须确保进程名称,否则将杀死错误的进程。

root@dev:~# pkill nginx
root@dev:~# systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Wed 2024-02-14 16:24:26 CST; 1s ago
Docs: man:nginx(8)
Process: 26497 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=1/FAILURE)
Process: 26482 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 26473 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 26484 (code=exited, status=0/SUCCESS)

如果一个进程有太多实例和多个子进程,我们有一个 “killall “命令,它以进程名称作为参数,而不是进程号。

8. 如何在 Linux 中使用 Killall 命令杀死进程?

“killall” 和 “kill” 的主要区别在于,”killall” 可以通过进程名称结束进程,而 “kill” 命令则依赖于进程 PID。

要杀死所有 nginx 实例及其子进程,使用以下命令:

killall mysqld
OR
pkill mysqld

可以使用以下任意命令来验证进程是否正在运行:

systemctl status nginx
pgrep nginx
ps -aux | grep nginx

感谢您花时间阅读文章!

收藏本站不迷路!

原文始发于微信公众号(滑翔的纸飞机):如何从命令行终止 Linux 进程?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/260793.html

(0)
土豆大侠的头像土豆大侠

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!