データをダウンロードするシェルスクリプト 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 も起動することとなります。
一方で、電源OnOffとは別の想定外の理由で、例えば interval_job がハングアップしてしまったとしましょう。その場合、systemd を使用した作り付けでは人間が気付くまで欠測は継続します。
しかしcrontabを使用する場合、ハングアップが発生した次の33分に新たな interval_job が実行されますので、欠測は最長1時間ということになります。
実行するジョブの堅牢性に自信が無い場合は、むしろcrontabを使用する方が良いのかも知れません。