启动unix后台进程维护订单

时间:2013-08-19 22:41:43

标签: shell unix nohup

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

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

问题是我确保进程按其调用顺序启动很重要。在尝试启动另一个流程之前,他们是否一直等到流程已经开始?

我试过等待,但是等到过程结束,我只是想确保过程已经开始。可能最简单的解决方案是在进程之间暂停几秒钟,是否有更好的解决方案?

由于

1 个答案:

答案 0 :(得分:1)

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

您遇到的问题是无法保证在shell返回之前nohup'ed进程运行多长时间。当您启动的进程“肯定已启动”时,取决于进程对初始化的作用。如果您没有应用程序的来源或由于某些其他原因而无法修改它们,您将仅限于查看其输出。许多守护进程将在初始化的各个阶段输出日志消息。您可以将脚本修改为

  1. 查找日志文件,如果不存在则创建一个空文件
  2. 打开日志文件进行读取(最后以避免以前调用的错误消息),查看指示进程已启动的日志消息,
  3. 使用nohup开始您的流程
  4. 等待您的日志文件观察器
  5. 在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
    

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