スクリプトを使用してcrontabを作成する方法
1. 概要
ソフトウェア設計の一部としてcronを使用し、そのソフトウェアを複数のマシンにインストールしたい場合があります。 インストールスクリプトを作成するには、スクリプトを介してcronジョブを追加する方法を知る必要があります。
このチュートリアルでは、 cron ジョブをいくつかの場所にインストールする方法と、これを行うためのスクリプトを作成する方法について説明します。
2. crontabのインストール
システムには2つの異なるcrontabファイルがあります。
- ユーザーcrontabファイル
- システムcrontabファイル
ユーザーcrontabファイルのジョブは、特定のユーザーに対してのみ実行されます。 したがって、すべてのユーザーに対してジョブを実行する必要がある場合は、それをシステムcrontabに追加する必要があります。
2.1. Cronジョブの例
サンプルスクリプトを作成しましょう– job.sh :
#!/bin/bash
echo `date +"%Y-%M-%d %T"`" - Hello Baeldung" >> /home/baeldung/log.txt
log.txt はいつでもチェックして、スケジュールされたジョブが実行されたかどうかを確認できます。
2.2. ユーザーへのジョブの追加crontab
ユーザーcrontabを理解するために、スクリプトを手動で追加してみましょう。
$ crontab -e
このコマンドは、既存のユーザーcrontabを編集するためのエディターを開きます。 cron式を追加しましょう。
30 0 * * * /home/baeldung/job.sh
これにより、スクリプトが毎日深夜30分後に実行されるようにスケジュールされます。 ホームディレクトリ/home /baeldungにジョブを作成しました。
また、現在のユーザーがこのスクリプトの実行権限を持っていることを確認する必要があります。 それでは、 chmodコマンドを使用してそれらを追加しましょう。
$ chmod +x /home/baeldung/job.sh
これで、 job.sh がスケジュールされ、毎日実行されます。 log.txtファイルを調べることでこれをテストできます。
2.3. システムへのジョブの追加crontab
システムcrontabを理解するために、このスクリプトも手動で追加しましょう。
$ sudo nano /etc/crontab
システムのcrontabファイルは/etc /crontabに保存されます。 次の行を追加しましょう。
30 0 * * * root /home/baeldung/job.sh
ルートユーザー名を指定する必要があることに注意してください。 これは、システムcronのジョブがシステムジョブであり、rootユーザーによって実行されるためです。
3. ユーザーにジョブを追加するためのスクリプトcrontab
次に、プロセスを自動化して、ユーザーcrontabに追加してみましょう。
3.1. crontabに新しいファイルをインストールします
まず、新しいスクリプトファイルを作成しましょう。
$ touch /home/baeldung/myScript.sh
スクリプトが最初に行うことは、現在のすべてのジョブのコピーを取得することです。
#!/bin/bash
crontab -l > crontab_new
これで、crontab_newファイルに以前のすべてのジョブが含まれます。 これは、新しいジョブを追加してから、編集したファイルをcrontabコマンドの入力引数として使用して、crontabをで書き換えることができることを意味します。
echo "30 0 * * * /home/baeldung/job.sh" >> crontab_new
crontab crontab_new
crontab_new ファイルは一時的なものであるため、次のように削除できます。
rm crontab_new
スクリプトを実行可能にするには、 chmod +xを使用することも忘れないでください。
$ chmod +x /home/baeldung/myScript.sh
$ ./myScript.sh
この方法はうまく機能しますが、一時ファイルを使用する必要があります。 さらに最適化できるかどうか見てみましょう。
3.2. パイプを使用して前のスクリプトを最適化する
以前のスクリプトは一時ファイルに依存しており、それを整理する必要がありました。 また、 cron エントリがすでにインストールされているかどうかもチェックされなかったため、複数回実行すると重複エントリがインストールされる可能性がありました。
パイプベーススクリプトを使用して、これらの両方に対処できます。
#!/bin/bash
(crontab -l; echo "30 0 * * * /home/baeldung/job.sh") | sort -u | crontab -
以前と同様に、 crontab-lおよびechoコマンドは、crontabの前の行と新しいエントリを書き出します。 これらはパイプで送られます選別重複する行を削除するコマンド
この結果はcrontabコマンドにパイプされ、crontabファイルが新しいエントリで書き換えられます。
ただし、 sortを使用すると、コメントを含めてファイルが完全に並べ替えられることに注意してください。 sort -u はスクリプトで非常に理解しやすいですが、 awk を使用すると、より破壊的でない重複排除を実現できます。
#!/bin/bash
(crontab -l; echo "30 0 * * * /home/baeldung/job.sh")|awk '!x[$0]++'|crontab -
これにより、crontabからすべての重複が並べ替えられずに削除されます。
4. システムにジョブを追加するためのスクリプトCron
次に、システムcronジョブのインストールスクリプトを記述します。
4.1. システムの使用crontab
まず、新しいスクリプトを作成しましょう。
$ touch /home/baeldung/myScript2.sh
システムスケジュール行の構文は、ユーザースケジュールに似ています。
#!/bin/bash
sudo /bin/bash -c 'echo "30 0 * * * root /home/baeldung/job.sh" >> /etc/crontab'
echoの前にsudo/ bin / bash を使用しています。これは、ユーザーがechoと[X143X ]rootユーザー。 そうしないと、echoだけがrootによって実行され、現在のユーザーの許可でリダイレクトが行われるため、permissiondeniedエラーが発生します。 -c オプションは、コマンドを一重引用符で囲んで文字列として取得し、シェルで実行するようにbashに指示します。
以前に使用したcrontabコマンドと比較すると、これは単純なファイル操作であることに注意してください。 エントリの重複を避けたい場合は、sortやawkなどの同様のフィルターを追加できます。
4.2. /etc/cron.dディレクトリの使用
/ etc / crontab パスに加えて、cronは/etc/cron.dディレクトリ内のすべてのファイルもシステムジョブと見なします。 したがって、/etc/cron.dディレクトリの新しいファイルにスケジュール行を配置することもできます。
/ etc / crontab ファイルの代わりに、cron.dディレクトリにジョブを追加するための別のスクリプトを作成してみましょう。
$ touch /home/baeldung/myScript3.sh
cron.dディレクトリの新しいファイルにスケジュール行を配置する必要があります。ファイルをscheduleと呼びます。 で注意してください /etc/cron.d 、一部のファイル名は無効と見なされます
#!/bin/bash
sudo touch /etc/cron.d/schedule
cron.d ディレクトリとそのサブディレクトリは通常、システムサービスによって使用され、rootユーザーのみがこれらのディレクトリにアクセスできます。 また、/etc/cron.d内のファイルはrootが所有している必要があります。 したがって、sudoを使用する必要があります。
次に、スケジュール行を schedule ファイルに入れて、権限を変更しましょう。
sudo echo "30 0 * * * root /home/baeldung/job.sh" > /etc/cron.d/schedule
sudo chmod 600 /etc/cron.d/schedule
ファイルのアクセス許可を600に変更することに注意してください。 これは、/ etc/cron.d内のファイルがグループまたは他のによって書き込み可能であってはならないためです。 それ以外の場合、それらは無視されます。 また、/etc/cron.dの下のスケジュールファイルは実行可能である必要はありません。 したがって、許可700は必要ありません。
5. 結論
この記事では、スクリプトを介してcrontabにジョブを追加するさまざまな方法について説明しました。
crontab コマンドと、 echo を使用してファイルに直接追加することの両方を使用して、ユーザーとシステムcrontabにジョブを追加する方法を確認しました。