\r\n\r\n
Linuxコマンドのcrontabで、様々な日常的、反復的な作業を自動化することにより、あなたの生活を簡素化することができます。この優れた使い勝手の良いツールは、数々のスクリプトと組み合わせることで、様々な作業を自動化するだけでなく、単純なヒューマンエラーや忘却を防ぐことにも役立ちます。
ここでは、crontabとは何か、自動化されたジョブを追加する方法、およびいくつかの実用的な例について学びます。
Crontabは、ほぼすべてのLinuxマシンでバックグラウンドで動作するプロセスで、自動化されたタスクを一定間隔でスケジュールして実行するために使用されます。また、ソフトウェア開発者が時間のかかる作業をバックグラウンドで実行するために使用されることも多い。
メールの大量送信、Twitterのチェック、バックアップ、リマインダーの実行など、あらゆることが可能です。
マシン上の各Linuxユーザーは、自分のアクティブなcrontabジョブを含む自分のcrontabファイルを持っています。以下は、crontabファイルを閲覧・修正するための基本的なターミナルコマンドです。
上記のコマンドは、現在のユーザーのcrontabファイルに対して使用されます。他のユーザのcrontabファイルを修正する必要がある場合は、単に-uオプションを使用します。例えば、以下のコマンドで、jdoeユーザのcrontabファイルを編集することができます。
sudo crontab -ujdoe -e各crontabのジョブは、以下のような書式で1行ずつ構成されています。
MINUTE HOUR DAY MONTH WEEKDAY COMMAND次の表は、crontabジョブのさまざまな要素を示しています。
エレメント | ラネージュ | 商品説明 |
---|---|---|
議事録 | 0 - 59 | crontabのジョブを実行する分数です。 |
時間 | 0 - 23 | crontabジョブの実行時間です。 |
天 | 1 - 31 | のcrontabジョブが実行された月。 |
月 | 1 - 12 | crontabジョブが実行された月。 |
営業日 | 0 - 6 | crontabジョブが実行される曜日。 |
受注状況 | ターミナルから実行可能なLinuxのコマンド全般。 |
どの項目にもアスタリスク(*)をつけると、ワイルドカードを示すことができ、この場合、crontabのジョブは1日のうちどの時間帯でも実行されることになります。例えば、以下のようなcrontabジョブが毎日午前3時20分に実行されます。
20 3 * * * /root/backup.shまた、各時間帯は複数の要素を含むことができる。カンマで区切ることで正確な値を指定することができます。以下のcrontabのジョブは、20分後と50分後に1時間に1回ずつ実行されます。
20,50 * * * * /path/to/command.shしかし、期間内の特定の間隔でcrontabジョブを実行するには、*/periodを使用することができ、以下のcrontabジョブが3時間ごとに15分後に自動的に実行されるようになります。
15 */3 * * * /path/to/command.sh状況によっては、crontabジョブからの出力をすべて排除して、システムのメールフォルダーに表示されないようにすることもできます。これは、任意のcrontabジョブに > /dev/null 2> &1 を添付することで可能です。例
0 6 15 * * /path/to/backup.sh > /dev/null 2>&1通常、crontabのジョブを追加・変更する最も一般的な方法は、crontab-eコマンドです。ターミナルで次のコマンドを実行します。
crontab -eこれにより、nanoなどのテキストエディタが開き、crontabファイルの内容が表示されます。各crontabジョブは1行に存在し、必要に応じて行を追加、変更、削除することができます。終了後、Ctrl+Wでファイルを保存して閉じ、YとEnterを押すと、ファイル内のすべてのcrontabジョブが即座に有効になります。
crontabファイルを手動で修正する以外に、クイックコマンドを実行してジョブを追加することも可能です。例えば、毎週日曜日の午後2時に実行するcrontabジョブを追加する場合。
0 14 * * 0 /path/to/command.shジョブは、以下のコマンド1つで、crontabファイルに追加することができます。
(crontab -l; echo "0 14 * * 0 /path/to/command.sh";) | crontab上記のコマンドは、単純にcrontabファイル内の現在のジョブをすべてリストアップし、新しいジョブを表示し、すべてをcrontabにインポートしてその内容を置き換えます。
以下のコマンドで、crontabファイル内の現在アクティブなジョブをすべてリストアップすることができます。
crontab -lまた、以下のコマンドで、すべてのcrontabジョブを削除し、crontabファイルの中身を空にすることができます。
crontab -r仕事中に2時間おきに、時間が経過したことを知らせるリマインダーが必要ですか?ほぼすべてのフォーマット(.wav, .mp4, 何でも)でお気に入りのオーディオクリップを取得し、(例えば)/home/myuser/my-alerts.wavに保存されていれば、自動的にcrontabジョブで再生されるようにする。
0 */2 * * * aplay /home/myuser/myalert.wav毎週金曜日の午後5時に、お気に入りの曲を自動再生して、仕事の疲れを癒すのはいかがでしょうか。好きな曲のクリップを取り、say/home/myuser/friday_song.mp4に保存すると、crontabのジョブが追加されます。
0 17 * * 5 aplay /home/myuser/friday_song.mp4crontabの優れた使い方として、リモートサーバにファイルを自動でバックアップする機能があります。この優れたrsyncチュートリアルを使えば、重要なデータを再び失う危険性を大幅に減らすことができます。
例えば、個々のサイトがオンラインであるかどうかを5分ごとに自動的にチェックし、サイトがダウンしている場合は電子メールで通知するようにしたいとします。そのためのPHPスクリプトを紹介します。
<?php// E-mail address to notify of sites down$email = '[email protected]';// Define URLs to check$urls = ['https://apexpl.io','https://google.com','https://some-junk-site-that-will-hopefully-never-exist.com'];// Go through URLs$down = [];foreach ($urls as $url) {// Check URL$status = check_url($url);if ($status != 200) {$down[] = $url;}}// Send e-mail if we have down sitesif (count($down) > 0) {mail($email, "Urgent - Sites Down!", "Your bot has detected the following sites are currently down:" . implode("", $down));}// Exitexit(0);/*** Check URL*/function check_url(string $url):int{// Send via cURL$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);$resp***e = curl_exec($ch);// Get status, and close connection$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);// Returnreturn $status;}ファイルの先頭でメールアドレスとチェックに必要なURLを変更し、/home/myuser/check etc. location_site.php に保存するだけです。 このスクリプトを5分ごとに実行させ、閉鎖したサイトをメールで通知するには、以下の場所にcrontabジョブを追加してください。
*/5 * * * * /usr/bin/php /home/myuser/check_sites.php > /dev/null 2>&1この記事を通して、crontabの自動化機能について学び、それを使ってあなたの生活の中の多くの平凡で反復的な作業を自動化する方法について学んでいただければと思います。
crontabとは何か、crontabファイルについて、crontabジョブがどのようにフォーマットされるか、そして、それをどのように活用するかについて、いくつかの実用的な例を学んでいただきました。