返回后台进程的值

我需要根据后台进程的返回值采取一些行动,即如果它终于在第一位。

具体来说就是:在理想的操作中,我作为后台进程运行的服务器将永远持续运行。 在这种情况下保持在后台是有道理的,因为我希望我的shell脚本在产生服务器之后做其他事情。 但是,如果服务器exception终止,我想最好使用服务器退出返回值来决定是否杀死我的主脚本。 如果这是不可能的,我至less要中止主脚本,而不是运行失败的服务器。

我在寻找shell脚本的asynchronouscallback的性质。 一个解决scheme是产生一个监视过程,定期检查服务器是否失败。 最好我想在主shell脚本本身没有这样做。

您可以将后台进程嵌套在脚本中。 例如,如果您希望发送到后台的进程被称为foo:

#!/bin/sh foo if [ $? ] then # do something here if process failed fi 

然后在后台运行上面的脚本而不是foo 。 如果需要将其关闭,则可以将其关闭,否则,只要foo继续运行,它就不会终止,如果foo死了,可以根据其错误代码进行任何操作。

当一个孩子通过陷阱SIGCHLD退出时,你可以使用shell陷阱来调用一个函数。 如果只有一个后台进程正在运行,那么你可以在sigchld处理程序中wait它,并获得状态。 如果运行多个背景的孩子会变得更复杂一些; 这里是一个代码示例(仅用bash测试):

 set -m # enable job control prtchld() { joblist=$(jobs -l | tr "\n" "^") while read -a jl -d "^"; do if [ ${jl[2]} == "Exit" ] ; then job=${jl[1]} status=${jl[3]} task=${jl[*]:4} break fi done <<< $joblist wait $job echo job $task exited: $status } trap prtchld SIGCHLD (sleep 5 ; exit 5) & (sleep 1 ; exit 7) & echo stuff is running wait 

我喜欢第一个更好的为我的目的,我认为在“如果进程失败,在这里做的事情”我可以通过使用它的名字杀死为foo调用这个包装脚本的脚本。

我认为第一个解决方案适用于多个孩子。 无论如何,我必须尽快完成这个工作,所以我使用了一个适用于我的应用程序的黑客程序:

我在主脚本中像往常一样在后台启动进程,然后使用$! 得到它的pid(因为$!返回最后一个bg pid),休眠2秒钟并执行ps -e | grep pid根据(ps -e | grep pid)的返回值来检查进程是否还在。 这适用于我,因为如果我的后台进程中止它立即(因为地址正在使用)。