重启后运行PHP脚本与Upstart
问题描述:
我有以下的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
答
上面的脚本几乎是正确的。主要的问题是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
只是一个猜测,但在重新启动我会假设用户在运行启动脚本/服务是不是你很可能根本。您是否尝试过使用sudo甚至su来运行命令来root并运行它。 –
是的,我试过了,我可以用sudo运行上面的命令,没有任何问题。我也可以以root用户身份运行这些命令。但我可以尝试更改从用户文件夹到某个“系统”文件夹的路径。也许用户的文件夹在启动早期不可用。 –
尝试使用像这样(http://askubuntu.com/questions/20229/how-to-run-an-application-at-startup-as-a-certain-user)将用户启动时切换到另一个用户(你自己)并运行该用户下的启动命令/服务。 –