解决Bash脚本获取当前Shell运行时长始终为0的问题
问题解决:Bash脚本正确获取当前Shell运行时长
问题核心原因
你遇到的问题本质是混淆了脚本子Shell与目标交互Shell的PID:
- 直接运行脚本时,系统会启动一个全新的Bash子进程执行脚本,此时
$$或BASHPID指向的是这个刚启动的子进程PID,而非你正在使用的交互Shell的PID。 - 子进程刚启动,
ps返回的etimes(运行时长)自然接近0,导致你的判断逻辑完全失效。
两种可靠修正方案
方案1:让脚本在当前Shell进程内执行
不要直接运行脚本,而是用source(或简写.)让脚本在当前交互Shell进程中执行,这样脚本里的$$和BASHPID会直接指向目标Shell的PID:
# 脚本示例(命名为check_runtime.sh) #!/bin/bash # 获取当前Shell运行时长,并用xargs去除输出前导空格 runtime=$(ps -o etimes= -p "$$" | xargs) if [ "$runtime" -gt 10 ]; then command1 else command2 command3 fi
执行脚本时使用:
source check_runtime.sh # 或简写为 . check_runtime.sh
方案2:手动传入目标Shell的PID
如果必须让脚本在子进程中执行,可以将当前交互Shell的PID作为参数传给脚本:
# 脚本示例 #!/bin/bash # 接收传入的目标Shell PID target_pid="$1" # 获取运行时长并清理格式 runtime=$(ps -o etimes= -p "$target_pid" | xargs) if [ "$runtime" -gt 10 ]; then command1 else command2 command3 fi
执行时传入当前Shell的PID:
./check_runtime.sh $$
关键细节提示
ps -o etimes= -p <PID>的输出可能带有前导空格,必须用xargs或tr -d ' '清理,否则会导致后续数值比较报错。- 若需要毫秒级精度,部分
ps版本支持etimesms参数替代etimes。
内容的提问来源于stack exchange,提问作者Saturnius
相关产品推荐
相关产品推荐

