命令简介

killall 是一个用于根据进程名称来终止进程的命令。它可以终止所有具有指定名称的进程,无需知道进程 ID。与 pkill 命令类似,killall 也是基于进程名称来操作的,但它们在实现方式和部分选项上有所不同。killall 命令是 Linux 系统管理员常用的进程管理工具之一。

命令语法格式

1
killall [options] [--] name [...]

其中:

  • name: 是要终止进程的名称。

参数使用说明

参数 说明 备注
-e, –exact 要求进程名称与指定名称完全匹配 -
-I, –ignore-case 忽略大小写 -
-g, –process-group 终止进程组而不是进程 -
-y, –younger-than 只终止比指定时间更新的进程 -
-o, –older-than 只终止比指定时间更旧的进程 -
-i, –interactive 在终止进程前进行确认 -
-l, –list 列出所有已知的信号名称 -
-q, –quiet 不输出任何信息 -
-r, –regexp 将进程名称视为扩展的正则表达式 -
-s, –signal 指定要发送的信号 默认为 TERM (15)
-u, –user 只终止指定用户的进程 -
-Z, –context 只终止具有指定安全上下文的进程 -
-c, –count 只终止指定数量的进程 -
-v, –verbose 输出详细信息 -
-w, –wait 等待所有已终止的进程退出 -

命令实例

基础用法

1.终止指定名称的进程

1
2
3
4
5
# 终止所有名称为 apache2 的进程
$ killall apache2

# 终止所有名称包含 http 的进程
$ killall http

2.使用不同的信号终止进程

1
2
3
4
5
# 使用 TERM (15) 信号终止进程
$ killall -s TERM http

# 使用 KILL (9) 信号强制终止进程
$ killall -s KILL http

3.列出可用的信号

1
2
3
4
5
6
7
8
$ killall -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

4.终止指定用户的进程

1
$ killall -u john

5.终止指定用户的所有 “firefox” 进程

1
$ killall -u leazhi firefox

6.精确匹配进程名称

1
$ killall -e http  # 只匹配进程名为 http 的进程

7.忽略大小写

1
$ killall -I HTTP  # 匹配进程名称中包含 HTTP 或 http 的进程

8.终止进程组

1
$ killall -g httpd  # 终止 httpd 进程组

9.终止更新/更旧的进程

1
2
$ killall -y 3600 httpd  # 终止比 3600 秒更新的 httpd 进程
$ killall -o 3600 httpd # 终止比 3600 秒更旧的 httpd 进程

扩展用法

1.在终止进程前进行确认

1
2
3
$ killall -i httpd
Kill apache2(1234) ? (y/n) y
Kill apache2(5678) ? (y/n) n

2.限制要终止的进程数量

1
$ killall -c 3 httpd  # 最多终止 3 个 httpd 进程

3.使用正则表达式匹配进程

1
2
$ killall -r '^http'  # 匹配以 http 开头的进程
$ killall -r 'apache2$' # 匹配以 apache2 结尾的进程

4.等待进程终止

1
$ killall -w httpd  # 等待所有 httpd 进程终止

5.结合 ps 命令筛选进程

1
2
3
4
5
# 终止所有 CPU 使用率超过 50% 的 "node" 进程
ps -eo pid,pcpu=,%cpu | awk '$4 > 50 {print $1}' | xargs killall -9 node

# 或者
killall -9 $(ps -eo pid,pcpu=,%cpu | awk '$4 > 50 {print $1}')

6.结合 grep 命令过滤结果

1
2
3
4
5
# 终止所有包含 "my-app" 字符串的进程
killall $(pgrep -f "my-app")

# 或者
killall $(ps -ef | grep "my-app" | awk '{print $2}')

高级用法

1.终止具有指定安全上下文的进程

1
$ killall -Z system_u:system_r:httpd_t:s0 httpd

该命令将终止具有 system_u:system_r:httpd_t:s0 安全上下文的 httpd 进程。

2.结合 pgrep 命令使用

killall 可以与 pgrep 命令结合使用,实现更加灵活和强大的功能。

1
2
3
4
5
# 终止所有占用内存超过 1GB 的进程
$ killall $(pgrep -d ',' -u root -a --sort="-,rss" | awk '{if ($2 > 1073741824) print $1}')

# 终止所有运行时间超过 24 小时的进程
$ killall $(pgrep -d ',' -u root -a --sort="-,start_time" | awk '{if ($2 < 86400) print $1}')

3.使用 killall 命令轮询重启服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建一个脚本,每 5 分钟检查一次 "sshd" 服务,如果未运行则重启
#!/bin/bash

while true; do
if ! pgrep -x sshd >/dev/null; then
echo "sshd service is not running, restarting..."
systemctl start sshd
fi
sleep 300
done

# 将脚本保存为 "restart-sshd.sh" 并设置可执行权限
chmod +x restart-sshd.sh

# 在后台运行脚本
nohup ./restart-sshd.sh &

4.使用 killall 命令监控进程并自动重启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建一个脚本,监控 "mysqld" 服务,如果 CPU 使用率超过 80% 则重启
#!/bin/bash

while true; do
cpu_usage=$(ps -eo pid,pcpu=,%cpu | grep -E "PID.+mysqld.+80.0" | awk '{print $4}')
if [ -n "$cpu_usage" ]; then
echo "mysqld service is using too much CPU, restarting..."
systemctl restart mysqld
fi
sleep 1
done

# 将脚本保存为 "monitor-mysqld.sh" 并设置可执行权限
chmod +x monitor-mysqld.sh

# 在后台运行脚本
nohup ./monitor-mysqld.sh &

以上就是关于 killall 命令的详细介绍和使用示例,希望对你有所帮助。如果还有任何疑问或需要进一步的帮助,欢迎随时提出。