You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题分析

  1. 逻辑错误:错误用ulimit值作为检测依据
    ulimit -u 20仅设置当前脚本进程的最大进程数限制,而非系统全局限制,因此$(ulimit -u)永远返回20,这个判断完全无法检测实际的fork炸弹情况。
  2. sudo运行时的用户判断问题
    使用sudo执行脚本时,whoami返回root,触发第二个if的否定分支,因此不会执行任何杀进程操作,也无输出。
  3. 未实际统计用户进程数量
    脚本完全没有统计目标用户的实际进程数,根本无法判断是否存在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参数强制终止顽固进程。

使用说明

  1. 赋予脚本执行权限:chmod +x bombDestroyer.zsh
  2. 普通用户直接运行:./bombDestroyer.zsh
  3. 管理员sudo运行:sudo ./bombDestroyer.zsh(会自动定位原用户)

内容的提问来源于stack exchange,提问作者Dani Hancock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:27:21