这取决于您所说的“绝对开始”是什么意思。如果您的意思是 fork(2) 已经完成并且新进程存在,那么每个进程都会在 nohup 返回时启动。已创建一个新进程。
您遇到的问题是无法保证 nohup 的进程在 shell 返回之前运行多长时间。您启动的进程何时“确定启动”取决于该进程为初始化所做的工作。如果您没有应用程序的源代码或由于其他原因无法修改它们,您将只能查看它们的输出。许多守护进程将在其初始化的各个阶段输出一条日志消息。您可以将脚本修改为
- 查找日志文件,如果不存在则创建一个空文件
- 打开日志文件进行读取(最后避免来自先前调用的错误消息),观察指示进程已启动的日志消息,
- 使用 nohup 开始您的流程,
- 等待您的日志文件观察者
在 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
您希望在分叉服务之前开始查看日志文件,否则,在启动服务的脚本可以附加到日志文件之前,该消息可能会在日志中通过。