-l或-e选项确认进程。
killall命令用于向一个或多个匹配指定名称的进程发送信号。默认发送SIGTERM(15)信号,允许进程进行清理工作后正常退出。如果需要强制终止进程,可以发送SIGKILL(9)信号。
主要特点:
与kill命令的区别:
kill:根据进程ID(PID)终止进程killall:根据进程名称终止进程pkill:根据进程名称或其他属性终止进程killall5:系统关机时使用的特殊版本killall [选项] [信号] 进程名...
killall -l [信号编号]
| 选项 | 说明 |
|---|---|
-e, --exact |
精确匹配进程名(长名称) |
-I, --ignore-case |
忽略大小写匹配 |
-i, --interactive |
交互模式,终止前询问确认 |
-r, --regexp |
使用正则表达式匹配进程名 |
-s, --signal |
指定要发送的信号(默认SIGTERM) |
-u, --user |
只终止指定用户的进程 |
-v, --verbose |
详细模式,显示详细信息 |
-w, --wait |
等待所有进程终止后才返回 |
-l, --list |
列出所有可用的信号名称 |
-o, --older-than |
只终止运行时间超过指定时间的进程 |
-y, --younger-than |
只终止运行时间少于指定时间的进程 |
-q, --quiet |
安静模式,不显示错误信息 |
-V, --version |
显示版本信息 |
| 信号编号 | 信号名称 | 说明 | 常用场景 |
|---|---|---|---|
| 1 | SIGHUP | 挂起信号,重新读取配置文件 | 重启守护进程 |
| 2 | SIGINT | 中断信号(Ctrl+C) | 终止前台进程 |
| 3 | SIGQUIT | 退出信号 | 终止并生成core dump |
| 9 | SIGKILL | 强制终止信号(不可捕获) | 强制终止无响应进程 |
| 11 | SIGSEGV | 段错误信号 | 内存访问错误 |
| 15 | SIGTERM | 终止信号(默认),允许进程清理 | 正常终止进程 |
| 18 | SIGCONT | 继续执行信号 | 恢复暂停的进程 |
| 19 | SIGSTOP | 暂停信号(不可捕获) | 暂停进程执行 |
| 20 | SIGTSTP | 终端停止信号(Ctrl+Z) | 暂停前台进程 |
# 终止所有名为firefox的进程(发送SIGTERM信号)
killall firefox
# 终止所有名为nginx的进程
killall nginx
# 终止所有名为python的进程
killall python
# 强制终止firefox进程(SIGKILL信号)
killall -9 firefox
killall -SIGKILL firefox
killall -KILL firefox
# 重启nginx进程(发送SIGHUP信号,重新读取配置)
killall -1 nginx
killall -HUP nginx
killall -SIGHUP nginx
# 暂停进程(发送SIGSTOP信号)
killall -19 firefox
# 恢复暂停的进程(发送SIGCONT信号)
killall -18 firefox
# 精确匹配进程名(必须完全匹配)
killall -e bash
# 交互模式,终止前询问确认
killall -i firefox
# 详细模式,显示终止的进程信息
killall -v nginx
# 忽略大小写匹配
killall -I CHROME
# 只终止指定用户的进程
killall -u www-data nginx
killall -u root bash
# 终止运行超过1小时的进程
killall -o 1h firefox
# 终止运行少于5分钟的进程
killall -y 5m python
# 终止运行超过1天(24小时)的进程
killall -o 1d httpd
# 使用正则表达式匹配进程名
killall -r "^php.*"
killall -r ".*python.*"
killall -r "java.*"
# 终止所有以"node"开头的进程
killall -r "^node"
# 终止所有包含"worker"的进程
killall -r "worker"
# 等待所有进程终止后再返回(阻塞模式)
killall -w mysql
# 安静模式,不显示错误信息
killall -q nonexistent_process
# 结合使用:安静模式并等待
killall -q -w apache2
# 列出所有信号名称
killall -l
# 查看特定信号编号对应的名称
killall -l 9
killall -l 15
killall -l 1 2 3 9 15
# 输出示例:
# 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
# ...
# 重启Web服务器(优雅重启)
killall -HUP apache2
killall -HUP nginx
# 强制终止所有Chrome进程(当浏览器无响应时)
killall -9 chrome
killall -9 google-chrome-stable
# 清理僵尸进程(可能需要根据实际情况调整)
killall -9 defunct
pkill -9 -f defunct
# 终止用户的所有进程(用户注销时)
killall -u username
killall -9 -u username
# 批量终止测试进程
killall -r "test_.*"
killall -r "worker_[0-9]+"
#!/bin/bash
# safe_killall.sh - 安全终止进程的步骤
PROCESS_NAME="$1"
# 1. 首先查看要终止的进程
echo "=== 查找进程: $PROCESS_NAME ==="
ps aux | grep -i "$PROCESS_NAME" | grep -v grep
# 2. 询问用户确认
read -p "确认要终止这些进程吗? (y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "操作取消"
exit 1
fi
# 3. 先尝试优雅终止(SIGTERM)
echo "尝试优雅终止..."
killall -TERM "$PROCESS_NAME"
sleep 3
# 4. 检查是否还有进程存在
if pgrep -x "$PROCESS_NAME" > /dev/null; then
echo "进程仍在运行,尝试强制终止..."
# 5. 强制终止(SIGKILL)
killall -KILL "$PROCESS_NAME"
sleep 2
# 6. 最终检查
if pgrep -x "$PROCESS_NAME" > /dev/null; then
echo "警告: 仍有进程存活"
ps aux | grep -i "$PROCESS_NAME" | grep -v grep
else
echo "进程已成功终止"
fi
else
echo "进程已成功终止"
fi
#!/bin/bash
# process_manager.sh - 批量进程管理脚本
ACTION="$1"
PROCESS_LIST="$2"
case "$ACTION" in
start)
echo "启动进程..."
# 这里添加启动命令
;;
stop)
echo "停止进程..."
if [ -z "$PROCESS_LIST" ]; then
echo "请指定要停止的进程列表(空格分隔)"
exit 1
fi
for process in $PROCESS_LIST; do
echo "停止 $process..."
killall -TERM "$process" 2>/dev/null
sleep 2
# 检查是否停止成功
if pgrep -x "$process" > /dev/null; then
echo "强制停止 $process..."
killall -KILL "$process" 2>/dev/null
fi
done
;;
restart)
echo "重启进程..."
$0 stop "$PROCESS_LIST"
sleep 3
$0 start "$PROCESS_LIST"
;;
status)
echo "进程状态:"
if [ -z "$PROCESS_LIST" ]; then
echo "请指定要检查的进程列表"
exit 1
fi
for process in $PROCESS_LIST; do
if pgrep -x "$process" > /dev/null; then
echo "✓ $process 正在运行"
ps -o pid,user,%cpu,%mem,start_time,cmd -C "$process"
else
echo "✗ $process 未运行"
fi
echo
done
;;
*)
echo "用法: $0 {start|stop|restart|status} [进程列表]"
exit 1
;;
esac
#!/bin/bash
# monitor_and_restart.sh - 监控进程并在异常时重启
PROCESS_NAME="$1"
CHECK_INTERVAL=30 # 检查间隔(秒)
MAX_RESTARTS=5 # 最大重启次数
RESTART_COUNT=0
echo "开始监控进程: $PROCESS_NAME"
while true; do
if ! pgrep -x "$PROCESS_NAME" > /dev/null; then
echo "[$(date)] 进程 $PROCESS_NAME 未运行"
if [ $RESTART_COUNT -lt $MAX_RESTARTS ]; then
RESTART_COUNT=$((RESTART_COUNT + 1))
echo "尝试重启 (第 $RESTART_COUNT 次) ..."
# 这里添加启动命令
# /path/to/start_script.sh &
echo "等待10秒后检查..."
sleep 10
else
echo "已达到最大重启次数 ($MAX_RESTARTS),停止监控"
exit 1
fi
else
# 重置重启计数
RESTART_COUNT=0
echo "[$(date)] 进程 $PROCESS_NAME 运行正常"
fi
sleep "$CHECK_INTERVAL"
done
#!/bin/bash
# cleanup_system.sh - 清理系统资源
echo "=== 系统清理开始 ==="
echo "当前时间: $(date)"
echo
# 1. 清理内存缓存
echo "1. 清理内存缓存..."
sync && echo 3 > /proc/sys/vm/drop_caches
# 2. 终止无响应的GUI程序
echo "2. 检查无响应的GUI程序..."
if pgrep -x "firefox" > /dev/null; then
if timeout 5s firefox --version > /dev/null 2>&1; then
echo " Firefox 正常"
else
echo " Firefox 无响应,尝试终止..."
killall -9 firefox 2>/dev/null
fi
fi
# 3. 清理临时文件进程
echo "3. 清理临时文件进程..."
find /tmp -type f -name "*.tmp" -mtime +1 -delete
find /var/tmp -type f -name "*.tmp" -mtime +7 -delete
# 4. 终止僵尸进程
echo "4. 查找僵尸进程..."
ZOMBIES=$(ps aux | awk '$8=="Z" {print $2}')
if [ -n "$ZOMBIES" ]; then
echo " 发现僵尸进程: $ZOMBIES"
# 尝试终止父进程
for pid in $ZOMBIES; do
PARENT_PID=$(ps -o ppid= -p "$pid" | tr -d ' ')
echo " 终止父进程 $PARENT_PID"
kill -9 "$PARENT_PID" 2>/dev/null
done
else
echo " 未发现僵尸进程"
fi
echo
echo "=== 系统清理完成 ==="
| 命令 | 语法 | 匹配方式 | 特点 | 示例 |
|---|---|---|---|---|
| killall | killall [选项] 进程名 |
根据进程名称 | 简单直观,一次终止多个同名进程 | killall firefox |
| pkill | pkill [选项] 模式 |
根据进程名或其他属性 | 功能强大,支持更多匹配选项 | pkill -f "python.*script" |
| kill | kill [选项] PID |
根据进程ID | 精确控制,需要知道PID | kill 1234 |
| killall5 | killall5 [选项] |
系统所有进程 | 系统关机时使用,向所有进程发送信号 | killall5 -9 |
-e选项避免误杀相似名称的进程-i选项或先查看再操作-r选项时要确保模式准确,避免匹配错误-w选项避免过早执行后续命令kill命令:
kill [信号] PIDkillall命令:
killall [信号] 进程名示例:
# kill命令需要PID
ps aux | grep firefox
kill 1234
# killall命令只需要进程名
killall firefox
使用-l或--list选项查看所有可用信号:
killall -l
# 查看特定信号编号
killall -l 9 15
# 或者使用kill命令查看
kill -l
常用信号说明:
1 (SIGHUP):挂起,通常用于重新读取配置文件2 (SIGINT):中断,相当于Ctrl+C9 (SIGKILL):强制终止,进程无法捕获或忽略15 (SIGTERM):终止,允许进程进行清理工作(默认)19 (SIGSTOP):暂停,进程无法捕获或忽略18 (SIGCONT):继续,恢复暂停的进程如果killall无法终止进程,可以尝试以下方法:
# 1. 检查是否有权限
sudo killall process_name
# 2. 使用SIGKILL(9)强制终止
killall -9 process_name
# 3. 检查进程状态,可能是僵尸进程
ps aux | grep process_name
# 如果状态是Z(僵尸),需要终止其父进程
# 4. 使用pkill命令尝试
pkill -9 -f process_name
# 5. 根据PID逐个终止
ps aux | grep process_name | awk '{print $2}' | xargs kill -9
# 6. 检查进程是否处于不可中断状态(D状态)
# 如果进程处于D状态(通常是I/O操作),需要等待或重启系统
# 7. 使用systemctl停止服务(如果是系统服务)
sudo systemctl stop service_name
注意事项:
避免误杀重要进程的方法:
# 1. 先查看要终止的进程
ps aux | grep process_name
ps -ef | grep process_name
# 2. 使用交互模式
killall -i process_name
# 3. 使用精确匹配
killall -e exact_process_name
# 4. 按用户过滤
killall -u username process_name
# 5. 先测试(使用echo显示而不实际执行)
echo "killall process_name"
# 6. 使用pkill的更多过滤选项
pkill -U username process_name # 按用户
pkill -t tty process_name # 按终端
# 7. 编写脚本进行验证
#!/bin/bash
PROCESS="process_name"
PIDS=$(pgrep "$PROCESS")
if [ -z "$PIDS" ]; then
echo "未找到进程: $PROCESS"
exit 1
fi
echo "找到以下进程:"
ps -o pid,user,cmd -p $PIDS
read -p "确认终止? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
kill $PIDS
fi
关键系统进程不要随意终止:
systemd、init:系统初始化进程sshd:SSH服务进程dbus-daemon:系统消息总线systemd-logind:登录管理mysqld、postgres等ps、pgrep或top查看进程信息-i选项确认-e选项避免误杀相似进程