0

我有一项服务,其中列出了 Twitter 帐户,并有一个开关可以为它们启用/禁用Streaming API连接。

目前我计划有这个流程:

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

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

执行 Phirehose 进程,尤其是以自动方式终止它存在一些风险和担忧。

关于以最大程度的自动化和最小的管理员干预来实现这一点的最佳方法的任何提示?

4

2 回答 2

1

我已经通过两步过程完成了类似的事情:第一部分是创建一个提供启动/停止命令的 Web 界面。Web 界面将文件写入服务器。一个用于启动,一个用于停止。开始锁定,停止锁定。

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

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

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

#!/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
于 2014-09-18T16:37:42.923 回答
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);
}

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

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

在我的 PhirehoseConsumer 类中,我重写了 log 方法来修剪输出以进行日志记录。

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 中退出,这样即使流媒体中断或互联网连接中断,该进程也会继续运行。

于 2014-10-29T03:18:51.167 回答