重新启动后使用Upstart运行PHP脚本

重新启动后使用Upstart运行PHP脚本,php,ubuntu,upstart,Php,Ubuntu,Upstart,我有下面的Upstart脚本。当我运行下面的命令service worker-1 start时,一切正常。我可以看到运行worker时使用的是ps aux | grep php。我还可以使用service worker-1 stop重新启动/更新worker。但不幸的是,这个脚本在重新启动时只能部分工作。脚本被执行(开始:作业已经在运行:worker-1,当我尝试service worker-1开始时),但我没有看到任何运行着ps aux | grep php的worker,当然service

我有下面的Upstart脚本。当我运行下面的命令
service worker-1 start
时,一切正常。我可以看到运行worker时使用的是
ps aux | grep php
。我还可以使用
service worker-1 stop
重新启动/更新worker。但不幸的是,这个脚本在重新启动时只能部分工作。脚本被执行(开始:作业已经在运行:worker-1,当我尝试
service worker-1开始时
),但我没有看到任何运行着
ps aux | grep php
的worker,当然
service worker-1 stop
返回
停止:未知实例:
。你知道会出什么问题吗

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
description“启动/杀死工人”
作者“Jiri Mihal”
启动时间(启动php5 fpm和mysql)
停机停机
预启动脚本
echo“[`date`]Workers start”>>/var/log/worker-1.log
exec 2>>/var/log/worker-1.log
结束脚本
启动后脚本
echo$$>/var/run/worker-1.pid
对于'seq15'中的i;
做
exec php/home/jiri/workers/dlapi.workers/workers/RpcWorkerLauncher.php Worker-1>/dev/null 2>&1&
完成
结束脚本
停止后脚本
读取-r第一行>/var/log/worker-1.log
结束脚本

上面的脚本几乎是正确的。主要问题是PHP脚本启动了RabbitMQ工作程序,但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
description“启动/杀死工人”
作者“Jiri Mihal”
启动(运行或启动rabbitmq服务器的rabbitmq服务器)
停止打开(关闭或rabbitmq服务器停止或停止rabbitmq服务器)
环境工作者=工作者名称
环境计数=5
预启动脚本
echo“[`date`]Workers start”>>/var/log/worker-$worker.log
结束脚本
启动后脚本
对于'seq 1$COUNT'中的i;
做
exec php/home/jiri/workers/dlapi.workers/workers/RpcWorkerLauncher.php$WORKER>/dev/null 2>&1&
如果[$i=1];然后
echo$!>/var/run/worker-$worker.pid
fi
完成
结束脚本
停止后脚本
读取-r PID>/var/log/worker-$worker.log
结束脚本

只是猜测,但在重新启动时,我假设运行启动脚本/服务的用户不是您,很可能是root用户。你有没有试过用sudo甚至su来运行这个命令?是的,我试过了,我可以用sudo运行上面的命令,没有任何问题。我还可以作为root用户运行这些命令。但我可以尝试将路径从用户文件夹更改为某个“系统”文件夹。可能用户的文件夹在启动初期不可用。请尝试使用类似以下()的方法将启动时的用户切换到另一个用户(您自己),并在该用户下运行启动命令/服务。@Mihi注意:sudo在功能上与root用户相同