后台进程的返回值

6
我需要根据后台进程的返回值采取一些操作,即如果它首先终止。具体来说,在理想情况下,我作为后台进程运行的服务器将永远保持运行状态。在这种情况下,将其保留在后台是有意义的,因为我希望我的shell脚本在生成服务器后执行其他任务。但是,如果服务器异常终止,我希望最好使用服务器的退出返回值来决定是否杀死我的主要脚本。如果不可能,我至少希望中止主要脚本,而不是使用失败的服务器运行它。
我正在寻找类似于shell脚本的异步回调的解决方案。一种解决方案是生成一个监控进程,定期检查服务器是否已失败。最好在主shell脚本本身中完成,而无需生成监控进程。
3个回答

2
您可以使用shell陷阱通过捕获SIGCHLD来调用函数以在子进程退出时处理。 如果只运行一个后台进程,则可以在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

0

针对我的目的,我更喜欢第一个解决方案。我认为在“如果进程失败,在此处执行某些操作”中,我可以使用它的名称杀死调用此包装脚本的foo脚本。

我认为第一个解决方案适用于多个子进程。无论如何,我必须快速完成这项任务,因此我使用了一个可以满足我的应用程序的hack:

像往常一样在主脚本中启动进程,然后使用$!获取其pid(因为$!返回最后一个bg pid),等待2秒钟并执行ps -e | grep pid以检查进程是否仍在运行,根据(ps -e | grep pid)的返回值进行判断。这对我来说效果很好,因为如果我的后台进程中止,它会立即中止(因为地址正在使用中)。


-2
你可以将后台进程嵌套在脚本中。例如,如果你想将名为foo的进程发送到后台:
#!/bin/sh

foo

if [ $? ]
then 
    # do something here if process failed
fi

然后只需在后台运行上述脚本,而不是foo。如果需要关闭它,您可以将其终止,但只要foo继续运行,它就永远不会终止,如果foo死亡,则可以根据其错误代码执行任何操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接