2

我有一个脚本,它在后台启动许多进程并使用 nohup 来确保这些进程继续运行 -

nohup "./$__service_script1.pl" $__service_args < /dev/null > /var/log/$__service_name.log 2>&1 &

这个问题对我来说很重要,以确保进程按调用顺序启动。在尝试启动另一个进程之前,他们是否有一种等待进程确定开始的方法?

我试过等待,但它一直等到进程完成,我只是想确保进程已经开始。可能最简单的解决方案是在进程之间休眠几秒钟,有更好的解决方案吗?

谢谢

4

1 回答 1

1

这取决于您所说的“绝对开始”是什么意思。如果您的意思是 fork(2) 已经完成并且新进程存在,那么每个进程都会在 nohup 返回时启动。已创建一个新进程。

您遇到的问题是无法保证 nohup 的进程在 shell 返回之前运行多长时间。您启动的进程何时“确定启动”取决于该进程为初始化所做的工作。如果您没有应用程序的源代码或由于其他原因无法修改它们,您将只能查看它们的输出。许多守护进程将在其初始化的各个阶段输出一条日志消息。您可以将脚本修改为

  1. 查找日志文件,如果不存在则创建一个空文件
  2. 打开日志文件进行读取(最后避免来自先前调用的错误消息),观察指示进程已启动的日志消息,
  3. 使用 nohup 开始您的流程,
  4. 等待您的日志文件观察者

在 bash 中,它看起来像这样可能会起作用(此代码完全未经测试):

log=<path to log file>
msg=<message service prints when it is ready>
svc=<path to service>

# Create log file if it does not exist
if [ ! -f "$log" ] ; then
     echo > "$log"
fi

# watch for message to appear on a single line in the log file 
tail -0 -f "$log" | egrep "$msg" | head -1 &
ready_pid=$!

# Start the service
nohup "$svc"  < /dev/null >> "$log" 2>&1 &

# Wait for the message
wait $ready_pid

您希望在分叉服务之前开始查看日志文件,否则,在启动服务的脚本可以附加到日志文件之前,该消息可能会在日志中通过。

于 2013-08-20T01:34:47.270 回答