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

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:30:14