如何检查以分离模式启动的命令的运行状态
如何检查以分离模式启动的命令的运行状态
这个问题我碰到过好几次,给你几个实用的解决方案,根据你的使用场景选就行:
保存进程ID,结合
wait和kill命令检查
当你执行cmd1 &后,shell会立刻返回这个后台进程的PID,你可以用$!这个内置变量直接捕获它,先把PID存下来:cmd1 & pid=$!- 如果你想等待命令结束并获取退出状态,直接用
wait $pid,这条命令会阻塞直到进程结束,之后用echo $?就能拿到它的退出状态(0表示成功,非0表示失败)。 - 如果你不想阻塞,想先判断进程是否还在运行,可以用
kill -0 $pid:如果这条命令返回0,说明进程还在跑;如果返回非0,说明进程已经结束了,这时候再执行wait $pid(不会阻塞),然后echo $?就能拿到退出状态。
- 如果你想等待命令结束并获取退出状态,直接用
将退出状态写入文件(跨会话也能用)
如果你需要在退出当前shell会话后,还能查看命令的运行状态,可以在启动命令时,直接把退出结果写入一个指定文件:(cmd1; echo $? > cmd1_exit_status.txt) &这样一来:
- 如果文件不存在,说明命令还在运行;
- 文件存在的话,直接查看文件内容
cat cmd1_exit_status.txt,0就是执行成功,非0就是执行失败。
这个方法的好处是完全不受shell会话的限制,即使你关掉当前终端,只要进程还在运行,结束后依然会把状态写入文件。
同一shell会话内用
jobs命令快速查看
如果你还没退出当前启动命令的shell,可以直接用jobs命令查看后台任务状态:jobs -l输出里会显示进程的PID、状态(比如
Running表示还在运行,Done表示成功结束,Exit 1表示失败退出)。不过这个方法仅限当前shell会话,一旦退出再重新登录,就看不到这个后台任务了。
备注:内容来源于stack exchange,提问作者Pat. ANDRIA
相关产品推荐
相关产品推荐

