cronでスクリプトを定期実行させようとしたのだけど、なぜかうまく行かなかったときの原因
【結論】
以下、長ったらしく文章を書いてますが、結論としてはcronで指定するスクリプトファイルにはちゃんと実行権限を付けること
です。
参考 : How to set a cron job to run a shell script? - Ask Ubuntu
またUbuntuではcronのログは
/var/log/syslog
に出力されるようです。
CronHowto - Community Help Wiki
下の話はそこに行き着くまでの経緯なので、興味があったら読んで見てください。
趣味と実験の一環としてWebカメラを使ってタイムラプス動画を撮ったりしています。最近のだとこんな作品になってます。
これはWebカメラを接続したパソコンで制御して連続写真を撮ってるんですが(ここではcronは使っていない)、たまーにWebカメラが認識しなくなって撮影が失敗していることがあります。一度撮影をセットしたら後はほぼ放置しているので、失敗したらその日の撮影はおじゃんとなります。また失敗していることに気が付いても、大抵は数時間後になんとか分かる程度。撮影を再開しても数時間分の撮影データはロストしていることになります。毎日タイムラプス動画をYoutubeにアップロードしているように見えてたまに日付が飛んでいるのは、そういった失敗によるものです。
ここまでは前置きで、ブログタイトルにあるcronの話はここから。
まずWebカメラが認識しなくなって撮影が失敗すると、撮影に使用しているプログラムがエラーをログファイルに出力します。撮影が順調に進んでいるかどうかを確認するには、常にログファイルを監視してエラーがないことを見ていればいいわけです。さて、監視すればいいとはいっても付きっきりで見ているわけにもいかないので、ここでcronを使ってログファイルにエラーが出力されているかどうかを定期的に調べればいいという算段です。
処理としてはそう難しい話ではなくて、単にgrepコマンドでエラーメッセージを拾うようにすればいいだけ。それをスクリプトファイル化してcronで数分毎に実行することで、撮影が失敗してるかどうかをチェックすることが出来ます。
(実際にはチェックに引っかかったらメールや通知を飛ばす処理や、自動的に撮影再開出来るようにする必要があります。そっちの処理はちょっと手間なので現在保留中)
さて、実際のところcronでコマンドやスクリプトを定期実行するといった処理はこれまでやったことはありませんでした。定期実行としてはwatchやwhileというコマンドでも出来るので、そっちはちょこちょこと使っていました。となると特にcronを使わなければならない理由も無いのですが、まぁ興味本位というかいろいろプログラムの特徴を覚えるといった意味でcronを使うことにしました。
で、本やWebサイトでcronを調べて見様見真似で設定したのですが、どうも指定したスクリプトファイルが実行されません。cronの設定の仕方をミスっているのかと思い、単純なコマンドを指定するようにしたらそれはちゃんと実行されました。なので、どうやらスクリプトファイルの書き方が間違っているのでは?と睨んでもう少し調べてみることに。
cronではbashではなくshをシェルとして使うようなので、もしかしたらスクリプトがshに合った書き方になっていないのかと思いました。ただこちらもシュルをshとしてスクリプトを実行すると、それはちゃんと実行されたので書き方は間違ってはいないようです。
さて、ここでしばらくウンウンと何が原因か考えていましたが、そういえばスクリプトファイルを実行するには実行権限を付ける必要があることを思い出しました。で、実際にスクリプトファイルに実行権限付けてcronを設定してみたら、あっさり解決。結構解決まで時間がかかった割には、単純なところで躓いてましたね…。
スクリプトファイルは実行権限を付けずに、
$ bash test01.bash
みたいに実行したりしていたので、まぁ普段の自分の行動が悪い方に出たというかなんというか。
とりあえずこれでcronの基礎の基礎まではなんとか出来るようになったかなぁと思うので、後は使いながら覚えていくことにします。
コメント
コメントを投稿