【问题标题】:Run PHP script with Upstart after reboot重启后使用 Upstart 运行 PHP 脚本
【发布时间】:2016-03-28 00:23:34
【问题描述】:

我有以下 Upstart 脚本。当我运行以下命令service worker-1 start 时,一切正常。我可以看到使用ps aux | grep php 运行的工人。我也可以使用service worker-1 stop,我需要重新启动/更新工作人员。但不幸的是,此脚本仅在重新启动时部分起作用。脚本已执行(开始:作业已在运行:当我尝试service worker-1 start 时,worker-1)但我没有看到任何正在运行的带有ps aux | grep php 的工人,当然service worker-1 stop 返回stop: Unknown instance:。你知道哪里出了问题吗?

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

【问题讨论】:

  • 只是猜测,但在重新启动时,我会假设运行启动脚本/服务的用户不是您,并且可能是 root。您是否尝试过使用 sudo 甚至 su 来运行命令并运行它。
  • 是的,我试过了,我可以用 sudo 运行上面的命令,没有任何问题。我也可以以 root 用户身份运行这些命令。但我可以尝试将路径从用户文件夹更改为某个“系统”文件夹。也许用户的文件夹在启动早期不可用。
  • 尝试使用类似这样的东西 (askubuntu.com/questions/20229/…) 将启动时的用户切换到另一个用户(您自己)并在该用户下运行启动命令/服务。
  • @Mihi 注意:sudo 在功能上与 root 用户相同

标签: php ubuntu upstart


【解决方案1】:

上面的脚本几乎是正确的。主要问题是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2014-02-18
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多