Zsh fork炸弹自动检测与缓解脚本故障排查求助
Zsh脚本检测并终止Fork炸弹问题排查与修复
问题描述
需要编写Zsh脚本自动检测并终止fork炸弹,已尝试的脚本内容如下,但使用sudo ./bombDestroyer.zsh运行时无输出、不生效;移除root判断后会误杀root进程导致虚拟机关机:
#!/bin/zsh # ulimit -u 20 #limit user process to 20 #Kill any process that exceeds the limit except for root if [[ $(ulimit -u) -eq 20 ]]; then if [[ $(whoami) != "root" ]]; then echo "Fork bomb detected. Killing user's processes" killall -u $(whoami) fi else echo "No fork bomb detected" exit 1 fi
问题分析
- 逻辑错误:错误用ulimit值作为检测依据
ulimit -u 20仅设置当前脚本进程的最大进程数限制,而非系统全局限制,因此$(ulimit -u)永远返回20,这个判断完全无法检测实际的fork炸弹情况。 - sudo运行时的用户判断问题
使用sudo执行脚本时,whoami返回root,触发第二个if的否定分支,因此不会执行任何杀进程操作,也无输出。 - 未实际统计用户进程数量
脚本完全没有统计目标用户的实际进程数,根本无法判断是否存在fork炸弹。
修复后的脚本
#!/bin/zsh # 设置进程数阈值(可根据需求调整) PROCESS_LIMIT=20 # 获取目标用户:如果是sudo运行,取原登录用户;否则取当前用户 TARGET_USER="${SUDO_USER:-$(whoami)}" # 统计目标用户的进程数量(排除ps自身进程) PROCESS_COUNT=$(ps -u "$TARGET_USER" --no-headers | wc -l) # 检测逻辑:非root用户且进程数超过阈值时触发 if [[ "$TARGET_USER" != "root" && "$PROCESS_COUNT" -gt "$PROCESS_LIMIT" ]]; then echo "Fork bomb detected for user $TARGET_USER. Killing all user processes..." # 使用pkill终止用户所有进程,-9强制终止(可选) pkill -u "$TARGET_USER" exit 0 else echo "No fork bomb detected for user $TARGET_USER. Current process count: $PROCESS_COUNT" exit 1 fi
关键修复点说明
- 正确获取目标用户:通过
${SUDO_USER:-$(whoami)}处理sudo场景,确保即使sudo运行也能定位到实际触发fork炸弹的普通用户。 - 实际统计进程数:用
ps -u "$TARGET_USER" --no-headers | wc -l准确统计用户的活跃进程数量。 - 合理的检测逻辑:仅当用户非root且进程数超过阈值时,才执行终止操作,避免误杀root进程。
- 更可靠的进程终止命令:
pkill -u比killall更稳定,专门用于按用户终止进程,也可添加-9参数强制终止顽固进程。
使用说明
- 赋予脚本执行权限:
chmod +x bombDestroyer.zsh - 普通用户直接运行:
./bombDestroyer.zsh - 管理员sudo运行:
sudo ./bombDestroyer.zsh(会自动定位原用户)
内容的提问来源于stack exchange,提问作者Dani Hancock
相关产品推荐
相关产品推荐

