在debian上运行php脚本(Apache)

Bla*_*use 2 apache debian apache2 objective-c push-notification

我正在尝试对我的debian vps(apace2,mysql)进行推送通知.

我使用本教程中的PHP脚本(http://www.raywenderlich.com/3525/apple-push-notification-services-tutorial-part-2).

基本上,脚本放在一个无限循环中,每隔几秒检查一次mysql表中的新记录.该教程说它应该作为后台进程运行.

// This script should be run as a background process on the server. It checks
// every few seconds for new messages in the database table push_queue and 
// sends them to the Apple Push Notification Service.
//
// Usage: php push.php development &
Run Code Online (Sandbox Code Playgroud)

所以我有四个问题.

  1. 如何从终端启动脚本?我应该输入什么?服务器上的脚本位置是:

    /var/www/development_folder/scripts/push2/push.php

  2. 如果需要,我怎么能杀死它(不必重新启动)?

  3. 由于推送通知是必不可少的,我需要一种方法来检查脚本是否正在运行.代码(来自教程)调用函数出错了:

    function fatalError($message)
    {
     writeToLog('Exiting with fatal error: ' . $message);
     exit;
    }
    
    Run Code Online (Sandbox Code Playgroud)

也许我可以在那里放一些东西来重启脚本?但是,如果脚本正在运行,那么每隔5分钟左右检查一次cron作业或其他事情也会很好,并且如果它没有,则启动它.

4 - 我可以在apace或mysql重启后自动启动脚本吗?如果服务器崩溃或其他需要快速重启的事情发生?

非常感谢提前

小智 8

  1. 您可以使用以下命令运行脚本:

    nohup php /var/www/development_folder/scripts/push2/push.php > /dev/null &
    
    Run Code Online (Sandbox Code Playgroud)

    nohup意味着当你关闭终端窗口时,命令不应该退出(它会忽略挂起信号).如果你不关心这个,你可以用"php /var/www/development_folder/scripts/push2/push.php&"来启动这个过程.PS!nohup将脚本输出记录为名为nohup.out的文件作为默认值,如果您不想这样,只需添加>/dev/null,就像我在这里所做的那样.&最后意味着进程将在后台运行.我只建议在测试代码时启动这样的推送脚本.该脚本应该在系统启动时作为守护程序运行(参见4.),如果它一直运行很重要.

  2. 只需输入

    ps ax | grep push.php
    
    Run Code Online (Sandbox Code Playgroud)

    你会得到processid(pid).它看起来像这样:

    4530 pts/3    S      0:00 php /var/www/development_folder/scripts/push2/push.php
    
    Run Code Online (Sandbox Code Playgroud)

    pid是你会看到的第一个数字.然后,您可以运行以下命令来终止脚本:

    kill -9 4530
    
    Run Code Online (Sandbox Code Playgroud)

    如果你运行ps ax | grep push.php再次过程现在应该消失了.

  3. 我建议您制作一个cronjob来检查php脚本是否正在运行,如果没有,则启动它.您可以使用shell脚本中的ps ax和grep检查来执行此操作.这样的事情应该这样做:

    if ! ps ax | grep -v grep | grep 'push.php' > /dev/null
    then
      nohup php /var/www/development_folder/scripts/push2/push.php > /dev/null &
    else
      echo "push-script is already running"
    fi
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果你想在启动系统后启动脚本,你可以在/etc/init.d中创建一个文件(例如/etc.init.d/mypushscript里面有这样的内容:

    php /var/www/development_folder/scripts/push2/push.php
    
    Run Code Online (Sandbox Code Playgroud)

    (你应该在这个文件中有更多)

    您还需要运行以下命令:

    chmod +x /etc/init.d/mypushscript
    update-rc.d mypushscript defaults
    
    Run Code Online (Sandbox Code Playgroud)

    使脚本在启动时启动.我没有测试过这个,所以请在制作自己的初始化脚本之前做更多的研究!

  • 非常彻底,优秀的答案!但是有一些注意事项:(1)PHP可以捕获关闭信号,如果挂起则只使用`kill -9`,否则,正常的kill会导致一个很好的清理(2)检查繁忙的服务器上运行的东西是否经常pid文件更有帮助,然后在整个`ps`中进行grepping.(3)当进入`init.d`路由时,我想补充说,查看`start-stop-daemon`有很多帮助,而且:Debian正在转向基于依赖的引导,而不是`update-rc .d`这样做的首选方法是使用`LSB tags`和`insserv`.但是取决于盒子的当前状态. (2认同)