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

为df命令设置超时并终止挂起进程的脚本问题求助

解决df命令超时挂起的问题

你的报错是因为bash的wait命令不支持直接传入超时时间参数,它只能等待指定的子进程完成,没有内置的超时判断功能。下面提供两种可靠的解决方案:

方法一:使用系统自带的timeout命令(推荐)

大多数Linux发行版都预装了timeout命令,它可以直接限制命令的运行时间,超时后自动终止进程,用法简单:

TIMEOUT=10
# 执行df命令,超时时间10秒
timeout $TIMEOUT df -hTP

# 根据退出码判断结果
case $? in
    0)
        echo "df命令执行成功"
        ;;
    124)
        echo "df命令挂起,已超时终止"
        ;;
    *)
        echo "df命令执行失败,退出码:$?"
        ;;
esac
  • 说明:timeout的退出码124表示命令超时被终止,其他退出码对应df命令本身的执行结果(比如权限问题、设备不存在等)。

方法二:手动实现超时逻辑(无timeout命令时使用)

如果系统没有timeout命令,可以通过后台进程+睡眠等待的方式实现超时控制,同时捕获命令输出:

TIMEOUT=10
TMP_OUTPUT="/tmp/df_output_$$.tmp" # 用进程ID命名临时文件,避免冲突

# 启动df命令到后台,将标准输出和错误输出写入临时文件
df -hTP > "$TMP_OUTPUT" 2>&1 &
DF_PID=$!

# 启动睡眠进程,超时后触发检查
sleep $TIMEOUT &
SLEEP_PID=$!

# 等待第一个完成的进程(df或sleep)
wait -n "$DF_PID" "$SLEEP_PID"

# 判断df进程是否还在运行
if kill -0 "$DF_PID" 2>/dev/null; then
    # df仍在运行,说明超时,终止进程
    kill "$DF_PID"
    echo "df命令挂起,已终止"
else
    # df已正常完成,终止睡眠进程(如果还在运行)
    kill "$SLEEP_PID" 2>/dev/null
    # 打印df的输出
    cat "$TMP_OUTPUT"
    echo "df命令执行成功"
fi

# 清理临时文件
rm -f "$TMP_OUTPUT"
  • 说明:wait -n用于等待第一个结束的子进程;kill -0用于检查进程是否存活(不会发送实际信号);临时文件用进程ID命名,避免多个脚本同时运行时的冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:18:12