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
相关产品推荐
相关产品推荐

