はじめに
sleepコマンドとは処理を中断することで待ち時間を発生させる手法で任意の秒数で指定できるので、場合によってはcronに登録するよりも手軽に利用できます。
本記事では、例えばコマンドを60秒毎に実行する場合におけるsleepとcronの違いについて分かりやすく説明します。
sleepコマンド
sleepコマンドはカレンダーとは切り離されて実行されます。
要は、指定された秒数を待機した後に実行されます。
例えば以下の記事にある通り
$ while :; do date ; sleep 60; done
とターミナルで実現すれば「Ctrl+C」で中止を行うまで一分毎にコマンドが実行されます。
一方で例えば dateコマンドではなく 別の時間がかかるコマンドを使用した場合、そちらの実行にかかった時間が無視できなくなるケースがあります。
要は、一連の処理が60秒ではなく61秒になってしまいます。
cron機構
以下にてcrontabを開いて
$ crontab -e
以下のように記載すれば毎分コマンドが実行されます。
* * * * * date >> /home/xxx/date.txt
こちらはカレンダーに従って実行されるので、コマンド発行に数秒かかってしまったとしても分が切り替われば実行されます。
ちなみにtimeコマンドを利用すればそのコマンドにどれくらい時間がかかったか確認できます。
以下のdateコマンドに対して
$ time date xxxx real 0m0.001s user 0m0.000s sys 0m0.004s
例えばwgetでHTMLを取得するともなると
time wget <url> .... real 0m1.645s user 0m0.016s sys 0m0.004s
一秒以上かかってしまいます。
前者の場合はsleepコマンドとcronで大きな差はありませんが、後者の場合は実行間隔に差がでてきます。
終わりに
定期的な処理はcronにて管理し、sleepコマンドはスクリプトの中で明示的に待ち時間を発生させたい場合に利用するのが良いと思います。
以上、UNIXの世界におけるsleepコマンドとcronの使い分けでした。ご参考になれば幸いです。