web-dev-qa-db-ja.com

Nohupを使用してスクリプトを無期限に実行し続ける

私はLinuxを非常に使い始めており、SSHを使用してWebサーバーにPuTTYするためだけに使用しています。私が抱えている問題はこれです:

基本的に私は2つのphpスクリプトを持っています。一方のget_tweets.phpは、ツイッターのツイートStreaming APIを常にリッスンし、もう一方のparse_tweets.phpは、これらをdbにログインします。これらが機能するためには、継続的に実行し続ける必要があります。

私は次のコマンドを使用して、バックグラウンドで実行し、それらを1日のほとんどの期間実行していることを確認しましたが、朝にコンピューターにログオンするたびに、scriptsが停止し、コマンドをもう一度実行する必要があります。

Nohup php my_script.php > /dev/null &

私が使用しているコマンドに基づいてそれが正常であるかどうか疑問に思っています。Nohupを使用すると、それらは無期限に実行されますか? CRONジョブ?

助けてくれてありがとう

7
Javacadabra

Nohupでは、エラーもリダイレクトする必要があります。次のコマンドは、/ dev/nullにリダイレクトする出力とエラーを含むスクリプトを実行します。

Nohup php my_script.php >/dev/null 2>&1 &

ただし、スクリプトは他の理由(スクリプトのエラー、oom-killerなど)で終了する可能性があります。したがって、システムのinitでデーモン化する必要があります(自動再起動をサポートしている場合-upstart、systemd、および他のユーザーがそれを実行できます)。または、スクリプトが実行されない場合は、チェック用のcronタスクを記述してスクリプトを再起動する必要があります。

9
loooser

おそらく、何が起こっているのかを確認し、出力を/dev/nullにリダイレクトしないでください。

screenまたはtmuxセッションを開くことをお勧めします。どちらもターミナルマルチプレクサであり、ログアウトしても存続します。

例えば。 (..)詳細

$ screen
$(inside screen-t1): ./get_tweets.php
.... running first

Ctrl-a cを押して、新しいターミナルを開きます。

 $(inside screen-t2): ./parse_tweets.php
 ... running second

Ctrl-a dを使用すると、セッションを切り離すことができます。再度ログオンするときは、screen -rを使用します

注:ステータスバーを画面に表示して、さまざまなウィンドウを視覚化できます。

4
Sebastian

スクリプトが終了したときにスクリプトが確実に再起動するようにしたい場合は、while true ; do php my_script.php ; done > /dev/nullのようなことを行うことができます

これは、my_script.phpの実行が完了するのを待ってから、再度実行します。すべての出力は/ dev/nullに送信されます

Nohupを使用する場合は、以下を実行する必要があります

$ echo 'while true ; do php my_script.php ; done > /dev/null' > ~/php_run_loop.sh
$ chmod a+x ~/php_run_loop.sh
$ Nohup ~/php_run_loop.sh

注:phpスクリプトにエラーまたはその他の問題がある場合、これにより無制限に繰り返し実行されます。これは優雅な解決策ではありませんが、解決策です。

ちなみに、cronはスケジュールが短いプロセス(5分ごと、または毎週など)を実行するのに適しています。既存のプロセスを実行し続ける方法がわかりません。

0
webmarc