我有一个脚本,它在后台启动许多进程,并使用nohup确保这些进程继续运行 -
nohup "./$__service_script1.pl" $__service_args < /dev/null > /var/log/$__service_name.log 2>&1 &
问题是我确保进程按其调用顺序启动很重要。在尝试启动另一个流程之前,他们是否一直等到流程已经开始?
我试过等待,但是等到过程结束,我只是想确保过程已经开始。可能最简单的解决方案是在进程之间暂停几秒钟,是否有更好的解决方案?
由于
答案 0 :(得分:1)
这取决于你的意思是“绝对开始”。如果你的意思是fork(2)已经完成并且新进程存在,那么每个进程都会在nohup返回时启动。已经创建了一个新流程。
您遇到的问题是无法保证在shell返回之前nohup'ed进程运行多长时间。当您启动的进程“肯定已启动”时,取决于进程对初始化的作用。如果您没有应用程序的来源或由于某些其他原因而无法修改它们,您将仅限于查看其输出。许多守护进程将在初始化的各个阶段输出日志消息。您可以将脚本修改为
在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
您希望在分叉服务之前开始查看日志文件,否则,在启动服务的脚本可以附加到日志文件之前,消息可能会在日志中显示。