Linux下kill、killall和pkill命令的功能与区别
Tags: kill -9killallLinuxOSpkill
1.kill命令
在Linux
中,kill
命令用于向指定的进程发送信号,用于终止进程或者修改进程的行为。
1.1kill命令常用功能
kill
命令的常用功能如下:
- 终止进程
使用kill
命令可以向指定的进程发送信号,用于终止进程。默认情况下,发送的是TERM
信号,这个信号会让进程优雅地退出,即会让进程自己执行清理操作然后退出。
- 修改进程的行为
使用kill
命令还可以向指定的进程发送其他信号,用于修改进程的行为。例如,使用HUP
信号可以重新加载进程的配置文件,使用USR1
信号可以让进程执行自定义的操作。
- 查看可用的信号
使用kill命令的-l
选项可以列出可用的信号。
1.2kill命令格式
1 | kill [options] <PID> |
其中,<PID>
表示要处理的进程ID号。可以同时指定多个PID,用空格分隔。options
表示kill命令的选项,可以用于指定要发送的信号。
1.3kill命令常用选项
选项/参数 | 描述 |
---|---|
-s <signal> | 指定要发送的信号。默认为TERM信号。 |
-l | 列出可用的信号。 |
-[signal] | 发送指定的信号。例如,-9 表示发送KILL信号。 |
-p | 打印进程ID号,不发送信号。 |
-a | 向所有进程发送信号。 |
-u <username> | 向指定用户的所有进程发送信号。 |
-t <terminal> | 向指定终端上的所有进程发送信号。 |
--help | 显示帮助信息。 |
--version | 显示版本信息。 |
注意,选项和参数可以组合使用,例如:
kill -9 -u username
:向用户名为username的所有进程发送KILL信号。kill -l
:列出所有可用的信号。kill -15 1234
:向进程ID为1234的进程发送TERM信号。kill -a -s HUP
:向所有进程发送HUP信号。
总之,kill命令的各种选项和参数可以让我们更加灵活地控制进程的行为,但在使用时需要注意避免误删重要的进程或数据。
1.4kill使用实例
1.4.1列出所有信号名称
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@haopython-gitlab ~]# 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 [root@haopython-gitlab ~]# |
这里边常用的信号:
- SIGTERM:表示终止进程的请求信号,通常用于优雅地停止进程。
- SIGKILL:表示强制终止进程的信号,不能被阻塞、处理或忽略。
- SIGINT:表示中断进程的信号,通常由CTRL+C键生成,用于终止正在运行的进程。
- SIGHUP:表示挂起进程的信号,通常用于重新读取配置文件或重新启动服务。
- SIGUSR1和SIGUSR2:表示用户自定义的信号,可以用于进程之间的通信或者进行自定义操作。
除了以上常用的信号,还有很多其他的信号,如SIGQUIT、SIGSTOP、SIGTSTP等等,每个信号都有其特定的含义和用途。
1.4.2得到指定信号的数值
1 2 3 4 5 6 7 8 9 | [root@haopython-gitlab ~]# kill -l KILL 9 [root@haopython-gitlab ~]# kill -l SIGKILL 9 [root@haopython-gitlab ~]# kill -l TERM 15 [root@haopython-gitlab ~]# kill -l SIGTERM 15 [root@haopython-gitlab ~]# |
1.4.3彻底杀死进程
先查找mysql数据库的进程pid,然后杀死该进程:
1 2 3 4 5 | [root@mysql01 ~]# ps -ef | grep mysqld mysql 17302 1 0 15:15 ? 00:00:01 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid root 17367 17222 0 15:19 pts/0 00:00:00 grep --color=auto mysqld [root@mysql01 ~]# kill -9 17302 [root@mysql01 ~]# |
2.killall命令
killall
命令用于杀死指定进程名的所有进程,其功能与kill命令类似,但它可以一次性杀死所有同名进程。
2.1killall命令格式
1 | killall [选项] 进程名 |
2.2killall命令参数
选项/参数 | 描述 |
---|---|
-e | 精确匹配进程名,避免误杀其他进程。如果进程名是另一个进程名的子串,那么使用该选项可以确保只杀死该进程名的进程。 |
-g | 指定进程组ID,将杀死该进程组中的所有进程。 |
-i | 交互式模式,杀死进程前要求用户确认。在执行killall命令时,如果加上了该选项,则系统会在杀死进程前要求用户确认,避免误杀重要进程。 |
-q | 安静模式,不输出任何信息。如果加上了该选项,则killall命令在执行时不会输出任何信息,只会杀死指定的进程。 |
-s | 指定信号类型,可以是数字或信号名称。使用该选项可以向指定进程发送指定类型的信号。默认情况下,killall命令会向进程发送SIGTERM信号。 |
-u | 指定用户名,将杀死该用户所有进程。如果加上了该选项,则killall命令会杀死指定用户的所有进程。 |
需要注意的是,killall命令会根据选项和参数指定的条件来杀死进程,因此在使用时需要特别注意,避免误删重要进程或数据。
2.3killall命令使用实例
2.3.1杀死名为"mysqld"的所有进程
1 | [root@mysql01 ~]# killall mysqld |
然后查看进程:
1 2 3 | [root@mysql01 ~]# ps -ef | grep mysqld mysql 17394 1 0 15:19 ? 00:00:01 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid root 17518 17222 0 15:28 pts/0 00:00:00 grep --color=auto mysqld |
也可以查看运行状态:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@mysql01 ~]# systemctl status mysqld ● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: inactive (dead) since 三 2023-06-14 15:28:34 CST; 8s ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 17391 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS) Process: 17369 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS) Main PID: 17394 (code=exited, status=0/SUCCESS) 6月 14 15:19:15 mysql01 systemd[1]: Starting MySQL Server... 6月 14 15:19:19 mysql01 systemd[1]: Started MySQL Server. [root@mysql01 ~]# |
2.3.2杀死名为"mysqld"的所有进程,并发送SIGTERM信号
1 2 | [root@mysql01 ~]# killall -s SIGTERM mysqld [root@mysql01 ~]# |
该命令将向所有名为mysqld
的进程发送SIGTERM
信号,通知它们优雅地停止执行。
2.3.3杀死名为myprogram
的所有进程,并发送SIGKILL
信号
1 2 | [root@mysql01 ~]# killall -s SIGKILL mysqld [root@mysql01 ~]# |
该命令将向所有名为mysqld
的进程发送SIGKILL
信号,立即杀死它们。
2.3.4杀死名为mysqld
的所有进程,但不杀死名为mysqld2`的进程
1 2 | [root@mysql01 ~]# killall -e mysqld [root@mysql01 ~]# |
该命令将杀死所有精确匹配名为mysqld
的进程,但不会误杀名为mysqld2
的进程。
2.3.5杀死指定用户所有进程
先查看用户moonrong进程:
1 2 3 4 | [root@mysql01 ~]# ps -f -u moonrong UID PID PPID C STIME TTY TIME CMD moonrong 18187 18186 0 16:07 pts/0 00:00:00 -bash [root@mysql01 ~]# |
然后执行:
1 2 | [root@mysql01 ~]# killall -u moonrong [root@mysql01 ~]# |
2.3.6定时杀死进程
有时候需要定时杀死某个进程,例如定时清理系统缓存或定时重启某个服务,可以使用定时任务结合killall
命令来实现。
例如,要每天凌晨3点定时重启名为mysqld
的服务,可以使用crontab
来设置定时任务,执行以下命令:
1 | crontab -e |
然后在编辑器中添加以下内容:
1 | 0 3 * * * killall -9 mysqld |
该命令将在每天凌晨3点执行killall命令,杀死名为"mysqld"的所有进程。
2.3.7关闭一组相关的进程
有时候多个进程可能是相互关联的,例如数据库服务和Web服务器,如果想要同时关闭它们,可以使用killall命令。
例如,要关闭所有名为"mysql"和"apache"的进程,可以执行以下命令:
1 | killall mysql apache |
该命令将杀死所有名为"mysql"和"apache"的进程。
2.4killall命令使用的场景
- 关闭某个应用程序的所有进程:有时候某个应用程序可能会启动多个进程,如果想要关闭所有这些进程,可以使用killall命令。
- 关闭崩溃的进程:如果某个进程崩溃了并且无法正常关闭,可以使用killall命令来杀死该进程。
- 关闭特定用户的所有进程:如果想要关闭某个用户的所有进程,可以使用killall命令。
- 关闭一组相关的进程:有时候多个进程可能是相互关联的,例如数据库服务和Web服务器,如果想要同时关闭它们,可以使用killall命令。
- 定时杀死进程:有时候需要定时杀死某个进程,例如定时清理系统缓存或定时重启某个服务,可以使用定时任务结合killall命令来实现。
3.pkill命令
pkill命令可以通过进程名或其他属性来查找并杀死进程。它的功能类似于killall命令,但是可以使用更多的匹配选项。
3.1pkill命令格式
1 | pkill [选项] 模式 |
其中,模式指定要查找并杀死的进程名称或其他属性。选项是可选的,用于指定其他选项,例如使用不同的信号、按用户杀死进程等等。
3.2pkill命令参数
参数 | 描述 |
---|---|
-f | 匹配进程的整个命令行参数,而不仅仅是进程名。 |
-u | 根据指定的用户ID或用户名查找进程。 |
-t | 根据指定的终端号查找进程。 |
-x | 仅匹配与指定名称完全相同的进程。 |
-n | 仅杀死最新的n个匹配的进程。 |
-e | 仅杀死和当前用户相关的进程。 |
-P | 杀死指定进程的父进程。 |
-g | 杀死指定进程组中的所有进程。 |
需要注意的是,使用pkill命令也需要谨慎,避免误删重要进程或数据。使用时应该根据实际情况选择合适的参数和选项。
3.3pkill使用场景及实例
pkill命令在Linux系统管理中有很多使用场景,以下是一些pkill命令的实例:
3.3.1杀死所有名为nginx
的进程
1 | pkill mysqld |
3.3.2杀死所有以my
开头的进程
1 | pkill '^my' |
3.3.3杀死用户moonrong的所有进程
1 | pkill -u moonrong |
3.3.4杀死所有命令行参数中包含pattern
的进程
1 | pkill -f pattern |
3.3.5杀死进程组中的所有进程
1 | pkill -g pgid |
3.3.6杀死最新的5个匹配进程
1 | pkill -n 5 pattern |
3.3.7杀死与指定终端相关的所有进程
1 | pkill -t pts/0 |
如果要踢出用户,需要采取其他措施,例如使用pkill -u username
命令杀死该用户的所有进程,或者使用pkill -KILL -t pts/0
命令强制杀死在该终端上运行的所有进程,然后使用killall -KILL -u username
命令强制杀死该用户的所有进程。
4.kill、killall与pkill命令对比
下面是kill、killall和pkill命令的对比表格:
命令 | 描述 | 优点 | 缺点 |
---|---|---|---|
kill | 根据PID杀死进程 | 简单易用 | 需要手动查找进程的PID |
killall | 根据进程名杀死所有进程 | 可以杀死多个进程 | 可能误杀其他进程 |
pkill | 根据进程名或其他属性杀死进程 | 可以根据多种属性杀死进程 | 某些选项可能需要root权限 |
这三个命令的主要区别在于,kill命令需要手动查找要杀死的进程的PID,而killall和pkill命令可以根据进程名或其他属性杀死进程。killall命令可以杀死多个进程,但有时可能误杀其他进程。pkill命令则可以根据多种属性杀死进程,但某些选项可能需要root权限。
总之,在Linux系统管理中,这三个命令都是非常有用的工具,可以根据不同的需求选择使用。