Linuxタスクの自動化に役立つ5つのCrontabの例

cronプログラムは、Linux上の他のプログラムの実行を自動化します。 Cronは、継続的に実行され、指定されたスケジュールに従って他のプログラムを開始するデーモンです。いくつかの異なるファイルがこのスケジュールを定義します。それらは個別にcrontabとして知られています。

Cronは、任意のUnixコマンドまたはタスクをスケジュールできます。単純なコマンドで作業したい場合があります。また、完全なタスクを実行するためのスクリプトを作成する必要がある場合もあります。 cronはどちらのアプローチでも問題なく動作します。また、複雑なスケジューリングルールとスクリプト出力を処理する柔軟な方法もサポートしています。

単純なユーザータスクを実行する場合でも、本格的なシステム管理を実行する場合でも、実際の例を使用してcronがどのように機能するかを理解する必要があります。

1.システム全体のcrontabを使用した/ tmpのクリーンアップ

/ tmpディレクトリは、システムの任意のプログラムまたはユーザーが汎用的に使用するための一時的な場所です。多くのUnixシステムは、起動時に/ tmpディレクトリ内の古いファイルを削除します。他の人はこの操作をスケジュールし、かなり頻繁にcronを使用します。

ただし、このプロセスをカスタム制御する場合、または別のディレクトリに適用する場合は、クイックcronタスクを設定するのが簡単な方法です。

/ tmpまたはその他の任意のディレクトリをクリーンアップする1つの方法は次のとおりです。

 1 3 * * * /usr/bin/find /tmp -type f -atime +10 -delete

毎日、3時1分にcronがこのコマンドを実行します。 findコマンドを使用して、/ tmpディレクトリ内のファイルを検索します。少なくとも10日前に最後に変更された通常のファイル以外のものをすべて除外します。次に、見つかったそのようなファイルをすべて削除します。

sudo crontab -eを使用して、このようなコマンドを/ etc / crontabやrootのcrontabなどのグローバルcrontabに追加する必要があります。コマンドはrootとして実行する必要があるため、所有者に関係なく/ tmp内のファイルを削除できます。

この例では、findコマンドへのフルパスを指定していることに注意してください。 Cronは基本的なPATH設定を使用して実行可能ファイルを検索するため、コマンドが標準の場所( / usr / binなど)にある場合、これは実際には必要ありません。そのアプローチが必要な場合は、crontab自体で代替PATHを指定できます。ただし、コマンドにフルパスを使用すると、回復力が少し向上します。

ログを書き込んだり、キャッシュされたデータを保存したりするプロジェクトで作業している場合、ファイルを削除してディスク領域をクリアする場合は、この種のアプローチが不可欠になる可能性があります。上記の例は手っ取り早いアプローチですが、使用可能な場合は、 tmpwatchなどのコマンドを使用する必要があります。

2.データベースのバックアップを1日2回

これからは、ローカルのcrontabを介して管理できるユーザー固有のタスクに焦点を当てましょう。次のコマンドを使用して、現在のユーザーのcrontabを編集できます。

 crontab -e

このcrontabには、ユーザーアカウントに固有のタスクが含まれている必要があります。 MySQLデータベースへの入力を含むプロジェクトに取り組んでいると想像してください。 mysqldumpツールを使用して、データベース全体のSQLダンプを作成できます。その出力をリダイレクトすることにより、簡単にスケジュールされたデータベースバックアップを行うことができます。

 30 4 * * * /usr/local/mysql/bin/mysqldump --login-path=local --databases albums > /tmp/album-db.$(date +%s).sql

デフォルトでは、cronは出力(エラーを含む)を電子メールでcrontabファイルが属するユーザーに送信します。ただし、 >ファイル名表記を使用して、コマンドラインからの場合と同じ方法で出力をリダイレクトできます

上記の例では、コマンド置換を使用して、現在のUnixタイムスタンプに基づいてファイル名を作成する方法に注意してください。 記号はcronにとって特別な意味を持っているため、コマンドは前に円記号を付けてエスケープする必要があります。

3.カスタムスクリプトを使用してサイトの稼働時間を確認する

最後の例のコマンドが不快なほど長いことに気づいたかもしれません。ありがたいことに、コマンドをスクリプトに保存し、crontabを介してそのスクリプトを実行することを妨げるものは何もありません。スクリプトを毎分実行する例を次に示します。

 * * * * * /Users/bobby/bin/site-monitor.sh

理論的には、短いコマンドにはHOME変数またはチルダ展開を使用できることに注意してください。

 * * * * * ~/bin/site-monitor.sh

cronがサポートを停止した場合に備えて、そうすることを避けることを選択できます。フルパスを使用しても実際に害はなく、間違いなく読みやすくなっています。

スクリプト自体は、curlプログラムを使用して、指定されたURLのHTTPステータスコードをフェッチします。ステータスが成功以外の何かを示している場合、スクリプトは出力にメッセージを書き込みます。

前述のように、cronはこの出力を電子メールで送信します。 cronのコマンドで、成功時に出力が生成されないようにすると便利な場合があります。

 #!/bin/bash
STATUS=`curl -s -o /dev/null -I -w "%{http_code}" http://example.com/`
if [ "$STATUS" != "200" ]
then
echo "site appears to be down"
fi

4.電子メールによるディスク容量レポート

cronのデフォルトの電子メール動作を変更する場合は、 MAILTO環境変数を使用できます。 Cronは、crontabファイルで設定できるいくつかの変数をサポートしています。次に、Cronは、これらの変数を後続の各コマンドの環境に適用します。

代替のターゲット電子メールアドレスを設定するには、次の形式を使用します。

 MAILTO=user@example.com

必要に応じて外部メールを送信するように設定されているマシンでこれを実行する必要があります。これは、同じマシン上の別のユーザーに電子メールを送信する例です。 1日2回、12:00と23:00に実行されます。 dfコマンドは空きディスク容量を表示するため、このcrontabエントリは、ディスク容量が正常に見えることを確認するタスクを委任します。

 MAILTO="sarah"
0 12,23 * * * /bin/df -h

結果の電子メールは次のようになります。

cronは独自のカスタム電子メールヘッダーを追加することに注意してください。これらはデバッグに役立ちます。空の文字列を使用して、cronのデフォルトの電子メール動作を無効にすることもできます。

 MAILTO=""

5.特定の時間にメッセージをブロードキャストする

他の例ではかなり単純なスケジューリングを使用していますが、cronは時間指定の強力な構文をサポートしています。完全一致だけでなく、次のことも処理します。

  • カンマで区切られた複数の値(
  • ハイフン( )で指定された範囲
  • スラッシュ( / )の後のステップ値

したがって、たとえば、ログインしているすべてのユーザーにメッセージを送信する場合、勤務時間中に1時間に2回、ただし3時間ごとにのみ、次のようなもので十分です。

 0 15,45 9-17/3 ? * * * echo 'Enjoy your work!' | wall

このコマンドは、午前9時から午後5時まで、3時間ごとに15分と45分に実行されます。 wallコマンドは、ログインしている各ターミナルユーザーにメッセージを送信します。

cronがカレンダーアプリよりも柔軟なスケジューリングを提供していることに気付くかもしれません。一部のバリエーションでは、月の第2金曜日、または特定の日付に最も近い平日に実行するコマンドを指定できます。

Cronは多くの種類のLinuxタスクを自動化できます

これは、cronが自動化に役立つタスクの種類の一部です。複雑な構文に慣れるまでには少し時間がかかるかもしれませんが、cronは強力なユーティリティです。 cronは、システム全体のタスクとユーザー固有のタスクの両方に使用できます。

スケジューリングの構文が複雑なため、cronは強力ですが、おそらく手元をよく参照する必要があります。 crontabはコメントを許可するため、時間フィールドを文書化するためにコメント行を含めることをお勧めします。