PC再起動にともなうジョブの再開

データをダウンロードするシェルスクリプト one_DL を作成しました。このone_DLについては後日言及することも有るかもしれませんが、とりあえず

1) 計測データをダウンロードするためのもので、実行には20秒程度必要とする。

2) 180秒に1回程度よりは頻繁に、繰り返し実行し続けなくてはならない。

という性質のものであると考えてください。

繰り返し実行するために、10秒間隔にジョブを実行する で作成したinterval_jobを使用して

 interval_job interval=175 job=one_DL

というコマンドを作成し、continuous_download.sh と名前を付けました。

この continuous_download.sh を rc.local に登録しておけば「PCの再起動に伴い自動的に continuous_download.sh も再起動してくれる」と思いきや、そうはなりませんでした。

ubuntu 16.04ではrc.localは無効化されており、systemd と呼ばれるシステムによりブート処理をしているのだそうです。何でもsystemctl とか何とかで登録するのだそうですが、うまくゆきませんでした。

systemd については改めて勉強するとして、continuous_download.sh の中身を

 

 kill `pgrep interval_job`

 kill `pgrep one_DL`

 interval_job interval=175 job=one_DL

 に変更し、crontab に登録することにしました。

user@Virtual-Ubuntu01:~/デスクトップ$ crontab -l
PATH=/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# m h dom mon dow command
33 */1 * * * /home/user/MyDoc/音声/continuous-download.sh

すなわち毎時33分になると、まず現在実行中のinterval_job がkill されます。その瞬間、たまたまone_DL が実行中ではない「待ち」状態ならば、すぐに次のinterval_job が再起動されることになります(CASE 1)。

あるいは、実行中のinterval_job がkill された瞬間、one_DL が実行中であれば、続けて one_DL もkill した後に次のinterval_job が再起動されることとなります(CASE 2)。これにより one_DL の二重起動を防止することができます。

最後にPCの電源が投入された場合ですが( CASE 3 )、rc.local が有効であったりsystemd の使い方を知っていたならば、Power On の直後速やかにinterval_job も起動してくれるのでしょうが、この作り方では電源を再投入した後、最初の33分が到来すると同時に interval_job も起動することとなります。

f:id:S_E_Hyphen:20171111155416j:plain

一方で、電源OnOffとは別の想定外の理由で、例えば interval_job がハングアップしてしまったとしましょう。その場合、systemd を使用した作り付けでは人間が気付くまで欠測は継続します。

しかしcrontabを使用する場合、ハングアップが発生した次の33分に新たな interval_job が実行されますので、欠測は最長1時間ということになります。

実行するジョブの堅牢性に自信が無い場合は、むしろcrontabを使用する方が良いのかも知れません。