質問: CentOS7におけるシェルスクリプトをサービス化する際の質問です。終了指示するまでは何年も永久にサービスを稼働し続けたいのですが、記述に気を付けるべき点を教えてください。 一定時間毎に起動させたい外部と通信するPHPがあります。 cronから呼び出すようにしたところ動作間隔がまちまちでイマイチでした。 そこで、無限ループするシェルスクリプトを記述してPHPを呼び出す際、開始時間と終了時間の差からsleepを入れるようにしたところ、想定通りの間隔で動作するようになりました。 当然ログアウト後も常時動作させたいので /etc/systemd/system に記述したところ(追記に記載します)...当時はサービスとして正常に起動していましたが、数週間後の昨日PHP部分?にて勝手に無限ループが停止しました。 PHPの実行時に何かあったのかもしれませんが...強制終了しようがそれはログに記録しておいて(としていたのに今回はログを調べていても原因が見つからないので困っていますが、それは一旦置きます)、構わず無かったかのように自動でそのまま無限ループを続けさせたいので、何卒よろしくお願い致します。
回答: ずーっと動いているはずのプロセスが止まる原因として、ふたつほど思いつきます。 * シグナルを受け取った * プロセスの制限を超えた trap でシグナルを捕捉してください。 $? を残しておけば、どのシグナルを受け取ったか分かります。 何らかの理由で外部から受け取ってるかもしれませんし、スクリプト中の echo は PIPE を通してファイルなどに書かれるでしょうから SIGPIPE を受け取る可能性はあります。 プロセスの制限の方は、ulimit で設定するあれです。 /etc/systemd/system/ の [Service] のところで定義できます。 使えるのは、こちらの Limit で始まるやつ。 CPU とか FSIZE とか、上限に達していても不思議ではありません。 後は、考え方を変えてループしない作りにしてみるとか。 sleep した後に、自分自身を nohup でバックグラウンドで起動する。 ``` #! /bin/sh ... sleep $diference_time nohup hogehoge.sh & # もうひとつ呼び出しておいて、自分は終了する ``` echo は、なにがしかのファイルにめがけて吐きましょう。