如何从PHP / bash脚本开始/结束后台进程?

时间:2014-09-18 14:20:20

标签: php bash phirehose

我有一项服务,我列出了Twitter帐户,并为他们启用/禁用 Streaming API 连接。

目前我正计划有这样的流程:

  • 用户启用流媒体的Twitter帐户
  • 电子邮件将发送给服务器上具有cli访问权限的管理员,该服务器将为该帐户启动 Phirehose 进程。
  • (一个cron作业会获取启用了Streaming的Twitter帐户列表,并检查是否存在流程。如果没有,它会向可以重新启动它的管理员发送一封电子邮件。)

当用户希望为Streaming启用Twitter帐户时,我想直接启动Phirehose进程以在后台运行。如果用户想要停止该帐户的流式传输,我也想直接终止该过程。

执行Phirehose流程存在一些风险和担忧,特别是以自动方式杀死它。

有关以最佳自动化和最小管理干扰实现此目标的最佳方法的任何提示吗?

2 个答案:

答案 0 :(得分:1)

我通过两个步骤完成了类似的事情: 第一部分是创建一个提供启动/停止命令的Web界面。 Web界面将文件写入服务器。一个开始,一个停止。 start.lock,stop.lock。

第二部分是一个bash脚本,用于查找这些文件的存在。下面是检查启动服务的start.sh脚本的示例。它创建一个“running.lock”文件,知道不要尝试启动正在运行的服务。您也会将这些文件用于报告目的。

stop.sh和start.sh是cron计划经常运行的。出于我的目的,它们每分钟运行一次,脚本中的循环用于更频繁地检查。即每分钟运行并每10秒检查一次。

我认为您可以根据自己的具体需求进行修改。希望它有所帮助。

#!/bin/bash

for ((c=1; c<=5; c++))
do

file="start.lock"
if [ -f "$file" ]
then
        sfile="running.lock"
        if [ ! -f "$sfile" ]
        then
                <command goes here>
                touch running.lock
                rm start.lock
        fi

fi

sleep 10
done

并阻止它:

#!/bin/bash

for (( c=1; c<=11; c++ ))
do
file="stop.lock"
if [ -f "$file" ]
then
        killall -9 <your service>
        rm running.lock
        rm start.lock
        rm stop.lock
fi
sleep 5
done

答案 1 :(得分:0)

我目前正在使用以下脚本来保持phirehose进程始终运行。我希望能够从php控制它,所以我也用php而不是bash编写了启动脚本。

我添加了一些代码,让我知道发生了什么类型的错误或非错误,但总是尝试重新连接。

phirehose-launcher.php:

<?php 

while(1) {
    passthru('/usr/bin/php my-phirehose-script.php', $code);

    // if exits with error, show error but try to reconnect
    if ($code) {
        print "Encountered an error.\n";
        print "Return code: $code.\n";
        print "Waiting 5 seconds and will retry connection.\n";
        sleep(5);
    } else {
        // if Phirehose exits gracefully, restart it
        print "Script exited. Restarting.\n";
    }

    // Try again in 5 secs
    sleep(5);
}

如果你想让它在后台运行,我还没有尝试过,但它应该可以添加一个&amp;在启动程序中的脚本名称之后(如下面的代码中所示)或启动程序脚本本身。

    passthru('/usr/bin/php my-phirehose-script.php &', $code);

在我的PhirehoseConsumer课程中,我覆盖了日志方法来修改输出以进行记录。

protected function log($message,$level='notice')
{
    switch($level) {
        case 'error':
            print "Phirehose [ERROR]: $message\n";
            break;
            // should email these or text
        case 'info':
            print "Phirehose [INFO]: $message\n";
            break;
        case 'notice':
        default:
            // meh
            break;
    }
}

我没有退出脚本,而是看到了这样的记录输出:

Phirehose [INFO]: Idle timeout: No stream activity for > 90 seconds.  Reconnecting.

你可以杀死启动器php脚本并杀死子进程。这是一种控制流程的简便方法。并且它可以捕获空闲超时并从phirehose退出,这样即使流中断或互联网连接,该过程也会继续运行。