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

Shell环境下执行time app命令时如何获取应用进程ID?

如何获取time myapp中myapp的进程ID

当你使用Shell内置的time命令时,time myapp &后台运行的是Shell的子进程(负责执行time逻辑),而myapp是这个子进程的子进程,因此$!获取到的是Shell子进程的ID,而非myapp的PID。以下是几种可行的解决方案:

方法1:使用外部time命令+子进程查找

大多数系统都有独立的time二进制文件(路径通常为/usr/bin/time),此时后台运行的是/usr/bin/time进程,myapp是它的直接子进程:

# 启动外部time和myapp
/usr/bin/time myapp &
# 获取外部time的PID
time_pid=$!
# 查找myapp的PID(它是time_pid的子进程)
myapp_pid=$(pgrep -P "$time_pid")

如果担心有多个子进程,可以结合进程名精准过滤:

myapp_pid=$(pgrep -P "$time_pid" -x myapp)

方法2:在子Shell中记录myapp的PID

通过子Shell先记录自身PID,再用exec替换为myapp进程,同时用time包裹整个子Shell:

# 启动后台任务,子Shell中先写PID到临时文件,再exec替换为myapp
(time sh -c 'echo $$ > /tmp/myapp.pid; exec myapp') &
# 读取临时文件获取PID
myapp_pid=$(cat /tmp/myapp.pid)
# 可选:用完临时文件后删除
# rm /tmp/myapp.pid

这里exec myapp的作用是让myapp直接替换子Shell进程,确保记录的$$就是myapp的PID,避免产生冗余的Shell进程。

方法3:通过父进程ID反向查找

如果必须使用Shell内置的time命令,可以先获取$!(即Shell执行time的子进程ID),再查找它的子进程:

time myapp &
time_shell_pid=$!
# 短暂等待确保myapp启动(避免直接查找不到)
sleep 0.1
# 提取子进程PID
myapp_pid=$(ps --ppid "$time_shell_pid" -o pid= | xargs)

注意:如果存在多个子进程,需要结合进程名进一步过滤,比如添加-C myapp参数到ps命令中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:15:05