2015-12-21 104 views
1

我有以下的Upstart脚本。当我运行以下命令service worker-1 start时,一切正常。我可以看到ps aux | grep php运行的工人。我也可以使用service worker-1 stop我需要重新启动/更新工人。但不幸的是,这个脚本仅在重启时部分工作。脚本被执行(开始:作业已经运行:worker-1当我尝试service worker-1 start)但我没有看到任何正在运行的工作人员ps aux | grep php,当然service worker-1 stop返回stop: Unknown instance:。你有什么想法可能是错的?重启后运行PHP脚本与Upstart

description "Starts/kills workers." 
author "Jiri Mihal" 
start on (started php5-fpm and started mysql) 
stop on shutdown 

pre-start script 
    echo "[`date`] Workers started" >> /var/log/worker-1.log 
    exec 2>>/var/log/worker-1.log 
end script 

post-start script 
    echo $$ > /var/run/worker-1.pid 
    for i in `seq 1 5`; 
    do 
     exec php /home/jiri/workers/dlapi.workers/workers/RpcWorkerLauncher.php Worker-1 >/dev/null 2>&1 & 
    done 
end script 

post-stop script 
    read -r FIRSTLINE < /var/run/worker-1.pid 
    kill $(($FIRSTLINE + 2)) 
    kill $(($FIRSTLINE + 3)) 
    kill $(($FIRSTLINE + 4)) 
    kill $(($FIRSTLINE + 5)) 
    kill $(($FIRSTLINE + 6)) 
    rm /var/run/worker-1.pid 
    echo "[`date`] Workers stopped" >> /var/log/worker-1.log 
end script 
+0

只是一个猜测,但在重新启动我会假设用户在运行启动脚本/服务是不是你很可能根本。您是否尝试过使用sudo甚至su来运行命令来root并运行它。 –

+0

是的,我试过了,我可以用sudo运行上面的命令,没有任何问题。我也可以以root用户身份运行这些命令。但我可以尝试更改从用户文件夹到某个“系统”文件夹的路径。也许用户的文件夹在启动早期不可用。 –

+0

尝试使用像这样(http://askubuntu.com/questions/20229/how-to-run-an-application-at-startup-as-a-certain-user)将用户启动时切换到另一个用户(你自己)并运行该用户下的启动命令/服务。 –

回答

1

上面的脚本几乎是正确的。主要的问题是PHP脚本启动了RabbitMQ worker,但RabbitMQ服务器还没有准备好。

我做了一些额外的微调,这里是一个工作的解决方案:

description "Starts/kills workers." 
author "Jiri Mihal" 
start on (rabbitmq-server-running or started rabbitmq-server) 
stop on (shutdown or rabbitmq-server-stopped or stopping rabbitmq-server) 

env WORKER=Workername 
env COUNT=5 

pre-start script 
    echo "[`date`] Workers started" >> /var/log/worker-$WORKER.log 
end script 

post-start script 
    for i in `seq 1 $COUNT`; 
    do 
     exec php /home/jiri/workers/dlapi.workers/workers/RpcWorkerLauncher.php $WORKER >/dev/null 2>&1 & 
     if [ $i = 1 ]; then 
      echo $! > /var/run/worker-$WORKER.pid 
     fi 
    done 
end script 

post-stop script 
    read -r PID < /var/run/worker-$WORKER.pid 
    for i in `seq 1 $COUNT`; 
    do 
     kill $(($PID + $i - 1)) 
    done 
    rm /var/run/worker-$WORKER.pid 
    echo "[`date`] Workers stopped" >> /var/log/worker-$WORKER.log 
end script