「Cron」の版間の差分
Kusakata.bot (トーク | 投稿記録) 細 (文字列「http://wiki.gentoo.org/」を「https://wiki.gentoo.org/」に置換) |
|||
(4人の利用者による、間の12版が非表示) | |||
1行目: | 1行目: | ||
{{Lowercase title}} |
{{Lowercase title}} |
||
− | [[Category: |
+ | [[Category:システム管理]] |
[[de:Cron]] |
[[de:Cron]] |
||
[[en:Cron]] |
[[en:Cron]] |
||
21行目: | 21行目: | ||
cron の実装はたくさん存在しますが、デフォルトではそのいずれもインストールされません。代わりにベースシステムは [[systemd/タイマー]] を使用しています。実装の比較については Gentoo の [https://wiki.gentoo.org/wiki/Cron/ja cron ガイド] を見て下さい。 |
cron の実装はたくさん存在しますが、デフォルトではそのいずれもインストールされません。代わりにベースシステムは [[systemd/タイマー]] を使用しています。実装の比較については Gentoo の [https://wiki.gentoo.org/wiki/Cron/ja cron ガイド] を見て下さい。 |
||
− | + | 利用可能なパッケージ: |
|
* {{Pkg|cronie}} |
* {{Pkg|cronie}} |
||
* {{Pkg|fcron}} |
* {{Pkg|fcron}} |
||
− | |||
− | [[AUR]] にあるパッケージ: |
||
− | |||
* {{AUR|dcron}} |
* {{AUR|dcron}} |
||
* {{AUR|vixie-cron}} |
* {{AUR|vixie-cron}} |
||
+ | * {{AUR|fcron-dev}} |
||
* {{AUR|scron-git}} |
* {{AUR|scron-git}} |
||
36行目: | 34行目: | ||
=== 有効化と自動起動 === |
=== 有効化と自動起動 === |
||
− | + | インストール後、デフォルトではデーモンは有効になりません。インストールされたパッケージは、[[systemd#ユニットを使う|systemctl]] で制御できるサービスを提供する可能性があります。たとえば、''cronie'' は {{ic|cronie.service}} を使用します。 |
|
− | # systemctl start cronie |
||
− | # systemctl enable cronie |
||
− | これらのコマンドはあなたが選んだ実装に合わせて変更してください、例えば: |
||
− | # systemctl start dcron |
||
− | # systemctl enable dcron |
||
− | {{ic|/etc/cron.daily/}} |
+ | {{ic|/etc/cron.daily/}} および同様のディレクトリをチェックして、どのジョブが存在するかを確認します。cron サービスを有効にすると、それらすべてがトリガーされます。 |
{{Note|''cronie'' には[[#非同期のジョブ処理|他のジョブの実行を遅延させる]]ための、{{ic|0anacron}} ''hourly'' ジョブが存在します。例えばコンピュータの電源を切った場合の標準実行の時があたります。}} |
{{Note|''cronie'' には[[#非同期のジョブ処理|他のジョブの実行を遅延させる]]ための、{{ic|0anacron}} ''hourly'' ジョブが存在します。例えばコンピュータの電源を切った場合の標準実行の時があたります。}} |
||
49行目: | 42行目: | ||
=== ジョブのエラーの対処 === |
=== ジョブのエラーの対処 === |
||
− | cron は |
+ | cron は、''stdout'' および ''stderr'' からの出力を登録し、{{ic|sendmail}} コマンドを介してユーザーのスプールに電子メールとして送信しようとします。{{ic|/usr/bin/sendmail}} が見つからない場合、Cronie はメール出力を無効にします。メールがユーザーのスプールに書き込まれるためには、{{Pkg|opensmtpd}} などの smtp デーモンがシステム上で実行されている必要があります。それ以外の場合は、sendmail コマンドを提供するパッケージをインストールして、リモートメールエクスチェンジャーにメールを送信するように設定できます。{{ic|-m}} オプションを使用し、カスタムスクリプトを記述して、メッセージをログに記録することもできます。 |
+ | |||
+ | {{Tip|[[Postfix#ローカルメール]] を使用してローカルシステムユーザーに出力を送信できます。}} |
||
# {{ic|cronie.service}} ユニットを[[Systemd#ユニットファイルの編集|編集]]する。 |
# {{ic|cronie.service}} ユニットを[[Systemd#ユニットファイルの編集|編集]]する。 |
||
− | # {{ |
+ | # {{AUR|esmtp}}, {{Pkg|msmtp}}, {{Pkg|opensmtpd}}, [[SSMTP|ssmtp]] をインストールする、もしくはカスタムスクリプトを書く。 |
==== ssmtp の例 ==== |
==== ssmtp の例 ==== |
||
− | ssmtp は送信だけを行う sendmail エミュレータで、ローカルコンピュータから smtp サーバーにメールを送信できます。活発なメンテナンスはされていませんが、設定済みのメールハブに対してメールを転送する方法としては最もシンプルです。デーモンを実行する必要はなく、設定ファイルを3行編集するだけで設定できます (認証されていないメールをメールハブでリレー |
+ | ssmtp は送信だけを行う sendmail エミュレータで、ローカルコンピュータから smtp サーバーにメールを送信できます。活発なメンテナンスはされていませんが、設定済みのメールハブに対してメールを転送する方法としては最もシンプルです。デーモンを実行する必要はなく、設定ファイルを3行編集するだけで設定できます (認証されていないメールをメールハブでリレーできる場合)。ssmtp はメールを受け取ったり、エイリアスを展開したり、キューを管理したりはしません。 |
− | {{ |
+ | {{AUR|ssmtp}} をインストールしてください。{{ic|/usr/bin/sendmail}} から {{ic|/usr/bin/ssmtp}} にシンボリックリンクが作成されます。インストールしたら {{ic|/etc/ssmtp/ssmtp.conf}} を編集してください。詳しくは [[SSMTP|ssmtp]] を参照。{{ic|/usr/bin/sendmail}} に対してシンボリックリンクが作成されることで [[S-nail]] などのプログラム ({{ic|/usr/bin/mail}} を提供するパッケージ) をそのまま使うことが可能です。 |
{{ic|/usr/bin/sendmail}} がインストールされていることを認識されるために {{ic|cronie}} を再起動してください。 |
{{ic|/usr/bin/sendmail}} がインストールされていることを認識されるために {{ic|cronie}} を再起動してください。 |
||
76行目: | 71行目: | ||
==== esmtp の例 ==== |
==== esmtp の例 ==== |
||
− | {{ |
+ | {{AUR|esmtp}} と {{Pkg|procmail}} をインストールしてください。 |
インストールした後、ルーティングを設定してください: |
インストールした後、ルーティングを設定してください: |
||
154行目: | 149行目: | ||
# MTA は postfix との接続を開いて、残りのボディが来るまで待っている間、接続を開き続ける。 |
# MTA は postfix との接続を開いて、残りのボディが来るまで待っている間、接続を開き続ける。 |
||
# 一時間以内に postfix はアイドル状態の接続を閉じて、以下のようなエラーを表示する: |
# 一時間以内に postfix はアイドル状態の接続を閉じて、以下のようなエラーを表示する: |
||
− | smtpmsg='421 |
+ | smtpmsg='421 ... Error: timeout exceeded' errormsg='the server did not accept the mail' |
{{Pkg|moreutils}} の chronic または sponge コマンドを使うことでこの問題は解決できます。それぞれの man ページより: |
{{Pkg|moreutils}} の chronic または sponge コマンドを使うことでこの問題は解決できます。それぞれの man ページより: |
||
174行目: | 169行目: | ||
* ''day_of_week'' は 0 から 6 までの値、0 が日曜日。 |
* ''day_of_week'' は 0 から 6 までの値、0 が日曜日。 |
||
− | カンマを使うことで複数の時間を指定することが |
+ | カンマを使うことで複数の時間を指定することができます。時間の範囲はハイフンで決めることができ、アスタリスクはワイルドカード文字になります。スペースはフィールドを分けるのに使います。例えば、次の行はスクリプト {{ic|i_love_cron.sh}} を夏の期間 (6月, 7月, 8月) を除く平日の午前9時から午後4:55まで5分間隔で実行します: |
*/5 9-16 * 1-5,9-12 1-5 ~/bin/i_love_cron.sh |
*/5 9-16 * 1-5,9-12 1-5 ~/bin/i_love_cron.sh |
||
254行目: | 249行目: | ||
== デフォルトエディタ == |
== デフォルトエディタ == |
||
− | + | 別の既定のエディターを使用するには、[[環境変数]] で説明されているように、シェル初期化スクリプトで {{ic|EDITOR}} 環境変数を定義します。 |
|
+ | 通常のユーザーとして、環境変数を正しく取得するには、{{ic|sudo}} の代わりに {{ic|su}} を使用する必要があります。 |
||
− | {{hc|/etc/profile.d/nano-default-editor.sh|2=<nowiki> |
||
− | #!/bin/sh |
||
− | |||
− | export EDITOR=/usr/bin/nano |
||
− | </nowiki>}} |
||
− | |||
− | 環境変数が正しく使われるようにするために、通常ユーザーでは、{{ic|sudo}} の代わりに {{ic|su}} を使う必要があります: |
||
$ su -c "crontab -e" |
$ su -c "crontab -e" |
||
+ | {{ic|su}} は新しいシェルで起動するため、この {{ic|printf}} にエイリアスを設定するには、任意の文字列を運ぶ必要があります。 |
||
− | 上記のコマンドをエイリアスにするときは {{ic|printf}} が必要です。{{ic|su}} を使うと新しいシェルが起動するためです: |
||
alias scron="su -c $(printf "%q " "crontab -e")" |
alias scron="su -c $(printf "%q " "crontab -e")" |
||
− | |||
− | == run-parts 問題 == |
||
− | |||
− | cronie は {{ic|run-parts}} を使用して {{ic|cron.daily}}/{{ic|cron.weekly}}/{{ic|cron.monthly}} のスクリプトを実行します。それらのスクリプトの名前にはドット (.) を含められないので注意してください (例: {{ic|backup.sh}})。オプションを付けないと {{ic|run-parts}} がスクリプトを無視してしまうためです (参照: {{ic|man run-parts}})。 |
||
== X.org サーバーを使用するアプリケーションを実行 == |
== X.org サーバーを使用するアプリケーションを実行 == |
||
− | Cron は X.org サーバー下では実行されないため、X.org サーバーアプリケーションを実行するために必要な環境変数を知りません。そのため、環境変数を定義する必要があります。{{AUR|xuserrun |
+ | Cron は X.org サーバー下では実行されないため、X.org サーバーアプリケーションを実行するために必要な環境変数を知りません。そのため、環境変数を定義する必要があります。{{AUR|xuserrun-git}} などのプログラムを使うことで X.org アプリケーションを実行できます: |
17 02 * ... /usr/bin/xuserrun /usr/bin/xclock |
17 02 * ... /usr/bin/xuserrun /usr/bin/xclock |
||
283行目: | 268行目: | ||
17 02 * ... env DISPLAY=:0 /usr/bin/xclock |
17 02 * ... env DISPLAY=:0 /usr/bin/xclock |
||
+ | |||
+ | cron でデスクトップ通知の notify-send を実行している場合、notify-send は値を dbus に送信します。したがって、dbus に正しいバスに接続するように指示する必要があります。 |
||
+ | |||
+ | アドレスは、DBUS_SESSION_BUS_ADDRESS 環境変数を調べて同じ値に設定することで見つけることができます: |
||
+ | |||
+ | 17 02 * ... env DBUS_SESSION_BUS_ADDRESS=your-address notify-send 'Foo bar' |
||
SSH などを通す場合は、権限を与えてください: |
SSH などを通す場合は、権限を与えてください: |
||
320行目: | 311行目: | ||
''anacron'' と同じように、{{Pkg|fcron}} はコンピュータの電源が落ちている場合を想定しますが、''anacron'' とは違って、一日よりも短いインターバルでイベントを組むことができます。定期的にサスペンド・ハイバネートを行うような環境 (ノートパソコンなど) で有用です。cronwhip と同様に、fcron はコンピュータが落ちている間に実行すべきだったジョブを実行します。 |
''anacron'' と同じように、{{Pkg|fcron}} はコンピュータの電源が落ちている場合を想定しますが、''anacron'' とは違って、一日よりも短いインターバルでイベントを組むことができます。定期的にサスペンド・ハイバネートを行うような環境 (ノートパソコンなど) で有用です。cronwhip と同様に、fcron はコンピュータが落ちている間に実行すべきだったジョブを実行します。 |
||
− | {{Pkg|cronie}} を fcron で置き換える場合、spool ディレクトリが {{ic|/var/spool/fcron}} になり、ユーザーの crontab を編集するときに ''crontab'' の代わりに {{ic|fcrontab}} コマンドを使うことになるので注意してください。crontab はバイナリ形式で保存され、spool ディレクトリに ''foo''.orig という名前のテキストファイルが |
+ | {{Pkg|cronie}} を fcron で置き換える場合、spool ディレクトリが {{ic|/var/spool/fcron}} になり、ユーザーの crontab を編集するときに ''crontab'' の代わりに {{ic|fcrontab}} コマンドを使うことになるので注意してください。crontab はバイナリ形式で保存され、spool ディレクトリに ''foo''.orig という名前のテキストファイルができます。手動でユーザーの crontab を編集するスクリプトを使っているのであれば、修正が必要です。 |
伝統的なユーザーの crontab を fcron 方式に変換するクイックスクリプトレット: |
伝統的なユーザーの crontab を fcron 方式に変換するクイックスクリプトレット: |
||
342行目: | 333行目: | ||
== cronie == |
== cronie == |
||
− | + | cronie に関連するファイル階層は次のとおりです。 |
|
− | /etc |
+ | /etc/ |
− | |----- |
+ | |----- cron.d/ |
− | |----- cron.d |
||
| ----- 0hourly |
| ----- 0hourly |
||
− | |----- cron. |
+ | |----- cron.minutely/ |
− | |----- cron. |
+ | |----- cron.hourly/ |
− | |----- cron.hourly |
||
| ----- 0anacron |
| ----- 0anacron |
||
− | |----- |
+ | |----- anacrontab |
− | |----- cron. |
+ | |----- cron.daily/ |
+ | |----- cron.monthly/ |
||
+ | |----- cron.weekly/ |
||
|----- crontab |
|----- crontab |
||
+ | |----- cron.deny |
||
+ | |||
+ | Cronie は ''cron'' と ''anacron'' の両方の機能を提供します。 ''cron'' は指定した時間にシステムが利用されている限り、一定時間間隔 (1分単位) でジョブを実行し、''anacron'' は指定した時間にコマンドを実行します。 |
||
+ | 間隔を日数で指定する。 cron とは異なり、システムが継続的に稼働していることを前提としません。システムが起動するたびに、''anacron'' は実行されるべきジョブがあるかどうかをチェックし、それに応じて処理します。 |
||
+ | |||
+ | ''cron'' ジョブは、{{ic|/etc/cron.d}} ディレクトリの crontab のようなファイルで定義するか、{{ic|/etc/crontab}} ファイル内に追加できます。後者はデフォルトでは存在しませんが、存在する場合は使用されます。{{ic|/etc/cron.d/0hourly}} の指示に従って、{{ic|/etc/cron.hourly}} 内の実行可能ファイルは毎時間実行されます (デフォルトでは毎時1分) {{ic|/etc/cron.minutely}} 内のファイルは、{{ic|/etc/cron.d/0hourly}} で適切に指示されている場合、毎分実行されます。実行可能ファイルは通常、シェルスクリプトであり、実行可能ファイルへのシンボリックリンクも使用できます。 |
||
+ | |||
+ | ''Anacron'' は、{{ic|/etc/cron.daily}}、{{ic|/etc/cron.weekly}}、および {{ic|/etc/cron.monthly} 内のファイルを実行することにより、同様に機能します。}} ディレクトリは、目的のジョブ頻度に応じてそこに配置されます。cron ジョブ {{ic|/etc/cron.hourly/0anacron}} は、保留中のタスクを実行するために ''anacron'' が 1日1回実行されるようにします。 |
||
+ | |||
+ | {{Note| |
||
+ | * Cronie は {{ic|run-parts}} を使って、異なるディレクトリのスクリプトを実行します。ファイル名にはドット (.) を含めてはいけません。なぜなら、デフォルトモードの {{ic|run-parts}} はドットを黙って無視するからです ({{man|8|run-parts}} 参照) 名前は大文字と小文字、数字、アンダースコア、マイナスハイフンのみで構成されている必要があります。 |
||
+ | * このような場合、{{ic|systemctl status cronie}} の出力には {{ic|CAN'T OPEN (/etc/crontab).No such file or digit}} というようなメッセージが表示されるかもしれません、しかし、これは cronie が必要としないので、無視することができます。 |
||
+ | * Cronie は {{ic|/etc/cron.d/0hourly}} のパーミッションが重要です。もし {{ic|/etc/cron.d/{hourly,weekly,daily} ...etc}} が破損していたり、不適切なパーミッションであれば、{{ic|/etc/cron.d/0hourly}} のタスクは (アナクロンランチャーを含め) 実行されません。{{ic|pacman -Qkk cronie}} はそのような問題があるかどうかを表示できます。 |
||
+ | }} |
||
+ | {{Tip|出力の送信を防ぎ、電子メールアラートを停止するには、各 cron ジョブの行末に {{ic|>/dev/null 2>&1}} を追加して、出力を /dev/null にリダイレクトします。 |
||
− | crontab ファイルはデフォルトでは作成されませんが、追加されたジョブは実行されます。Cronie は cron と anacron の両方の機能を提供します。マシンの時刻が指定した日時になったときに cron は特定の間隔 (精度は1分まで) でジョブを実行するのに対して、anacron は特定日時にマシンの電源が入っているかどうか関係なくジョブを実行します (精度は最低1日)。マシンの電源が入ると、anacron は実行しておくべきジョブがないかどうか確認して、あれば実行します。{{ic|/etc/cron.d}} と {{ic|/etc/cron.hourly}} ディレクトリは '''cron''' 機能で使用し、{{ic|/etc/anacrontab}} ファイルと {{ic|/etc/cron.daily}}, {{ic|/etc/cron.weekly}}, {{ic|/etc/cron.monthly}} ディレクトリは '''anacron''' 機能で使用します。{{ic|/etc/cron.deny}} ファイルは特にジョブの作成を禁止されていないユーザーが cron ジョブを作成することができます。 |
||
+ | 0 1 5 10 * /path/to/script.sh >/dev/null 2>&1 |
||
− | システム全体の cron ジョブを作りたい場合、crontab のようなファイルを作成して {{ic|/etc/cron.d}} ディレクトリに配置するか {{ic|/etc/crontab}} にジョブを追加してください。{{ic|/etc/cron.hourly}} に存在する実行可能ファイル (普通は全てシェルスクリプト) は毎時間実行されます。 |
||
+ | {{ic|1=MAILTO=””}} 変数を crontab ファイルに設定して、メールアラートを無効にすることもできます。}} |
||
− | Anacron 機能も同じように実装されていますが、使用するのは {{ic|/etc/cron.daily}}, {{ic|/etc/cron.weekly}}, {{ic|/etc/cron.monthly}} ディレクトリで、ジョブを実行する間隔で決めます。anacron のジョブファイルも実行可能ファイルです。crontab フォーマットではありません。Anacron は毎時間 crontab ファイルの {{ic|/etc/cron.d/0hourly}} によって {{ic|/etc/cron.hourly}} の中にある {{ic|/etc/cron.hourly/0anacron}} ファイルから実行されます。ファイルを削除すると anacron が実行されなくなります。 |
||
== Dcron == |
== Dcron == |
||
402行目: | 407行目: | ||
== 参照 == |
== 参照 == |
||
− | * [ |
+ | * [https://www.gentoo.org/doc/en/cron-guide.xml Gentoo Linux Cron Guide] |
2024年8月19日 (月) 09:26時点における最新版
Wikipedia より:
- cron は Unix ライクなコンピュータオペレーティングシステムにおける時間基準のジョブスケジューラです。cron を使うことでジョブ (コマンドやシェルスクリプト) をスケジュールして定期的に特定の時刻・時間に実行することが可能になります。システムのメンテナンスや管理を自動化するためによく使われます。
目次
インストール
cron の実装はたくさん存在しますが、デフォルトではそのいずれもインストールされません。代わりにベースシステムは systemd/タイマー を使用しています。実装の比較については Gentoo の cron ガイド を見て下さい。
利用可能なパッケージ:
設定
有効化と自動起動
インストール後、デフォルトではデーモンは有効になりません。インストールされたパッケージは、systemctl で制御できるサービスを提供する可能性があります。たとえば、cronie は cronie.service
を使用します。
/etc/cron.daily/
および同様のディレクトリをチェックして、どのジョブが存在するかを確認します。cron サービスを有効にすると、それらすべてがトリガーされます。
ジョブのエラーの対処
cron は、stdout および stderr からの出力を登録し、sendmail
コマンドを介してユーザーのスプールに電子メールとして送信しようとします。/usr/bin/sendmail
が見つからない場合、Cronie はメール出力を無効にします。メールがユーザーのスプールに書き込まれるためには、opensmtpd などの smtp デーモンがシステム上で実行されている必要があります。それ以外の場合は、sendmail コマンドを提供するパッケージをインストールして、リモートメールエクスチェンジャーにメールを送信するように設定できます。-m
オプションを使用し、カスタムスクリプトを記述して、メッセージをログに記録することもできます。
ssmtp の例
ssmtp は送信だけを行う sendmail エミュレータで、ローカルコンピュータから smtp サーバーにメールを送信できます。活発なメンテナンスはされていませんが、設定済みのメールハブに対してメールを転送する方法としては最もシンプルです。デーモンを実行する必要はなく、設定ファイルを3行編集するだけで設定できます (認証されていないメールをメールハブでリレーできる場合)。ssmtp はメールを受け取ったり、エイリアスを展開したり、キューを管理したりはしません。
ssmtpAUR をインストールしてください。/usr/bin/sendmail
から /usr/bin/ssmtp
にシンボリックリンクが作成されます。インストールしたら /etc/ssmtp/ssmtp.conf
を編集してください。詳しくは ssmtp を参照。/usr/bin/sendmail
に対してシンボリックリンクが作成されることで S-nail などのプログラム (/usr/bin/mail
を提供するパッケージ) をそのまま使うことが可能です。
/usr/bin/sendmail
がインストールされていることを認識されるために cronie
を再起動してください。
msmtp の例
msmtp を使って cronie からメールを取得する方法は2つあります:
- msmtp-mta パッケージをインストールします。
/usr/bin/sendmail
から/usr/bin/msmtp
にシンボリックリンクが作成されます。cronie
を再起動して新しいsendmail
コマンドが検出されていることを確認してください。msmtp にユーザー名をメールアドレスに変換する手段を用意する必要があります。- 次のように crontab に
MAILTO
行を追加する:MAILTO=your@email.com
または: /etc/msmtprc
に次の行を加えて:aliases /etc/aliases
/etc/aliases
を作成してください:your_username: your@email.com
# Optional:
default: your@email.com
- 次のように crontab に
cronie.service
ユニットを編集します。例えば、/etc/systemd/system/cronie.service.d/msmtp.conf
を作成してください:[Service] ExecStart= ExecStart=/usr/bin/crond -n -m '/usr/bin/msmtp -t'
esmtp の例
esmtpAUR と procmail をインストールしてください。
インストールした後、ルーティングを設定してください:
/etc/esmtprc
identity myself@myisp.com hostname mail.myisp.com:25 username "myself" password "secret" starttls enabled default mda "/usr/bin/procmail -d%T"
Procmail は配送モードで動作するのに root 権限を必要としますが cronjob を root で実行している場合は問題になりません。
正しく動作しているかテストするには、ファイル message.txt
を作成して中に "test message"
を記述してください。
同じディレクトリから次を実行してください:
$ sendmail user_name < message.txt
そして:
$ cat /var/spool/mail/user_name
テストメッセージと送信された日時が表示されるはずです。
全てのジョブのエラー出力は /var/spool/mail/user_name
にリダイレクトされます。
権限の問題で、root にメールを作成・送信するのは困難です (例: su -c ""
)。esmtp
の設定で root のメールを全て通常のユーザーに転送させることができます:
/etc/esmtprc
force_mda="user-name"
opensmtpd の例
opensmtpd をインストールしてください。
/etc/smtpd/smtpd.conf
を編集します。以下の設定でローカル配信が可能になります:
listen on localhost accept for local deliver to mbox
次のコマンドでテストが行えます:
# systemctl start smtpd $ echo test | sendmail user
user は mbox フォーマットを扱えるメールクライアントを使うか、/var/spool/mail/user
ファイルを見ることでメールを確認できます。全てが問題なく動作するようでしたら、opensmtpd を有効にします:
# systemctl enable smtpd
この方法には、リモートサーバーに cron のローカルな通知が送信しないという利点があります。ネットワーク接続も必要ありません。欠点としては、新しいデーモンを実行する必要があります。
長い cron ジョブ
仮に cron によって以下のプログラムが実行されると:
#!/bin/sh echo "I had a recoverable error!" sleep 1h
以下のことが起こります:
- cron がスクリプトを実行
- 出力があったらすぐに、cron は MTA を実行し、MTA にヘッダーをわたす。ジョブは完了しておらず、出力がまだあるかもしれないので、パイプは開きっぱなしになる。
- MTA は postfix との接続を開いて、残りのボディが来るまで待っている間、接続を開き続ける。
- 一時間以内に postfix はアイドル状態の接続を閉じて、以下のようなエラーを表示する:
smtpmsg='421 ... Error: timeout exceeded' errormsg='the server did not accept the mail'
moreutils の chronic または sponge コマンドを使うことでこの問題は解決できます。それぞれの man ページより:
- chronic
- chronic はコマンドを実行して、コマンドが失敗した場合にのみ (0以外の終了コードが吐かれたりクラッシュしたとき)、標準出力や標準エラーが表示されるようにします。コマンドが問題なく実行されたときは、何も出力されません。
- sponge
- sponge は標準入力を読み込んで指定されたファイルに書き出します。シェルのリダイレクトと違って、sponge は出力ファイルを開く前のあらゆる入力を吸い上げてしまいます。出力ファイルが指定されなかったときは、sponge は標準出力に出力します。
マニュアルには載っていませんが、chronic は標準出力を開く前のコマンド出力をバッファします (sponge も同じようにバッファを使います)。
Crontab のフォーマット
crontab の基本的なフォーマットは:
minute hour day_of_month month day_of_week command
- minute は 0 から 59 までの値。
- hour は 0 から 23 までの値。
- day_of_month は 1 から 31 までの値。
- month は 1 から 12 までの値。
- day_of_week は 0 から 6 までの値、0 が日曜日。
カンマを使うことで複数の時間を指定することができます。時間の範囲はハイフンで決めることができ、アスタリスクはワイルドカード文字になります。スペースはフィールドを分けるのに使います。例えば、次の行はスクリプト i_love_cron.sh
を夏の期間 (6月, 7月, 8月) を除く平日の午前9時から午後4:55まで5分間隔で実行します:
*/5 9-16 * 1-5,9-12 1-5 ~/bin/i_love_cron.sh
さらに、crontab には特殊なキーワードもいくつか存在します:
@reboot : 起動時 @yearly : 一年毎 @annually ( == @yearly) @monthly : 一月毎 @weekly : 一周毎 @daily : 一日毎 @midnight ( == @daily) @hourly : 一時間毎
例えば、起動時に i_love_cron.sh
を実行する場合:
@reboot ~/bin/i_love_cron.sh
参照: http://www.adminschoice.com/crontab-quick-reference
基本的なコマンド
Crontab を直接編集してはいけません。代わりに、ユーザーは crontab
プログラムを使って crontab を編集してください。このコマンドを実行するには、ユーザーは users グループのメンバーである必要があります (gpasswd
コマンドを見て下さい)。
crontab を一覧するには、次のコマンドを実行してください:
$ crontab -l
crontab を編集するには、次のコマンドを使って下さい:
$ crontab -e
crontab を削除するには、次のコマンドを使って下さい:
$ crontab -r
既に crontab が存在していて、古い crontab を完全に上書きするには次を使って下さい:
$ crontab saved_crontab_filename
コマンドライン (Wikipedia:ja:標準ストリーム) から crontab を上書きするには:
$ crontab -
他の誰かの crontab を編集するには、次のコマンドを root で実行してください:
# crontab -u username -e
同じフォーマット (コマンドに -u username
を追加すること) は crontab の表示・削除にも使えます。
サンプル
コマンド /bin/echo Hello, world!
を毎月の毎日の毎時間の1分目 (つまり 12:01, 1:01, 2:01 ...) に実行するエントリ:
01 * * * * /bin/echo Hello, world!
1月の平日に5分ごと (つまり 12:00, 12:05, 12:10 ...) に同じジョブを実行するエントリ:
*/5 * * jan mon-fri /bin/echo Hello, world!
次の行は夏 (6月, 7月, 8月) 以外の毎月の平日 (月-金) の午前9時から午後5時まで5分間隔で (午後5時0分は除く) スクリプト i_love_cron.sh
を実行します ("man 5 crontab" より):
*0,*5 9-16 * 1-5,9-12 1-5 /home/user/bin/i_love_cron.sh
定期的な設定は次の crontab テンプレートのように入力することも可能です:
# Chronological table of program loadings # Edit with "crontab" for proper functionality, "man 5 crontab" for formatting # User: johndoe # mm hh DD MM W /path/progam [--option]... ( W = weekday: 0-6 [Sun=0] ) 21 01 * * * /usr/bin/systemctl hibernate @weekly $HOME/.local/bin/trash-empty
デフォルトエディタ
別の既定のエディターを使用するには、環境変数 で説明されているように、シェル初期化スクリプトで EDITOR
環境変数を定義します。
通常のユーザーとして、環境変数を正しく取得するには、sudo
の代わりに su
を使用する必要があります。
$ su -c "crontab -e"
su
は新しいシェルで起動するため、この printf
にエイリアスを設定するには、任意の文字列を運ぶ必要があります。
alias scron="su -c $(printf "%q " "crontab -e")"
X.org サーバーを使用するアプリケーションを実行
Cron は X.org サーバー下では実行されないため、X.org サーバーアプリケーションを実行するために必要な環境変数を知りません。そのため、環境変数を定義する必要があります。xuserrun-gitAUR などのプログラムを使うことで X.org アプリケーションを実行できます:
17 02 * ... /usr/bin/xuserrun /usr/bin/xclock
もしくは環境変数を手動で定義する方法もあります (echo $DISPLAY
で現在の DISPLAY の値がわかります):
17 02 * ... env DISPLAY=:0 /usr/bin/xclock
cron でデスクトップ通知の notify-send を実行している場合、notify-send は値を dbus に送信します。したがって、dbus に正しいバスに接続するように指示する必要があります。
アドレスは、DBUS_SESSION_BUS_ADDRESS 環境変数を調べて同じ値に設定することで見つけることができます:
17 02 * ... env DBUS_SESSION_BUS_ADDRESS=your-address notify-send 'Foo bar'
SSH などを通す場合は、権限を与えてください:
# xhost +si:localuser:$(whoami)
非同期のジョブ処理
コンピュータをオフにしてもジョブがちゃんと実行されるようにしたい場合、複数の解決方法が存在します (簡単な順番で並んでいます):
Cronie
Cronie には anacron が含まれています。プロジェクトのホームページより:
Cronie には特定時刻に指定したプログラムを起動するための標準 UNIX デーモンである crond と関連ツールが含まれています。Cronie はオリジナルの cron をベースとしており、pam や SELinux を利用できるようにするなどの改善がされています。
Dcron
dcronAUR は標準で非同期のジョブ処理をサポートしています。以下のようにジョブの名前に @hourly, @daily, @weekly, @monthly を付けて下さい:
@hourly ID=greatest_ever_job echo This job is very useful.
Cronwhip
cronwhipAUR は見過ごされた cron ジョブを自動的に実行するスクリプトです。昔 Arch でデフォルトの cron 実装だった dcron で動作します。フォーラムスレッド も参照。
Anacron
Anacron はジョブを非同期に処理する dcron を完全に置き換えます。
Anacron は cronie に含まれており、設定ファイルは /etc/anacrontab
です。フォーマットの情報は anacrontab(5)
man ページにあります。anacron -T
を実行することで /etc/anacrontab
に問題がないかテストすることができます。
Fcron
anacron と同じように、fcron はコンピュータの電源が落ちている場合を想定しますが、anacron とは違って、一日よりも短いインターバルでイベントを組むことができます。定期的にサスペンド・ハイバネートを行うような環境 (ノートパソコンなど) で有用です。cronwhip と同様に、fcron はコンピュータが落ちている間に実行すべきだったジョブを実行します。
cronie を fcron で置き換える場合、spool ディレクトリが /var/spool/fcron
になり、ユーザーの crontab を編集するときに crontab の代わりに fcrontab
コマンドを使うことになるので注意してください。crontab はバイナリ形式で保存され、spool ディレクトリに foo.orig という名前のテキストファイルができます。手動でユーザーの crontab を編集するスクリプトを使っているのであれば、修正が必要です。
伝統的なユーザーの crontab を fcron 方式に変換するクイックスクリプトレット:
cd /var/spool/cron && ( for ctab in *; do fcrontab ${ctab} -u ${ctab} done )
フォーラムスレッド も参照。
排他性の確保
ジョブの実行時間が長くなる可能性がある場合 (例えばシステムのバックアップは変更箇所が多かったりネットワーク接続が遅かったりして長くなることがあります)、flock
(util-linux) を使うことで cron ジョブが二重に実行されないようにすることができます。
5,35 * * * * /usr/bin/flock -n /tmp/lock.backup /root/make-backup.sh
cronie
cronie に関連するファイル階層は次のとおりです。
/etc/ |----- cron.d/ | ----- 0hourly |----- cron.minutely/ |----- cron.hourly/ | ----- 0anacron |----- anacrontab |----- cron.daily/ |----- cron.monthly/ |----- cron.weekly/ |----- crontab |----- cron.deny
Cronie は cron と anacron の両方の機能を提供します。 cron は指定した時間にシステムが利用されている限り、一定時間間隔 (1分単位) でジョブを実行し、anacron は指定した時間にコマンドを実行します。 間隔を日数で指定する。 cron とは異なり、システムが継続的に稼働していることを前提としません。システムが起動するたびに、anacron は実行されるべきジョブがあるかどうかをチェックし、それに応じて処理します。
cron ジョブは、/etc/cron.d
ディレクトリの crontab のようなファイルで定義するか、/etc/crontab
ファイル内に追加できます。後者はデフォルトでは存在しませんが、存在する場合は使用されます。/etc/cron.d/0hourly
の指示に従って、/etc/cron.hourly
内の実行可能ファイルは毎時間実行されます (デフォルトでは毎時1分) /etc/cron.minutely
内のファイルは、/etc/cron.d/0hourly
で適切に指示されている場合、毎分実行されます。実行可能ファイルは通常、シェルスクリプトであり、実行可能ファイルへのシンボリックリンクも使用できます。
Anacron は、/etc/cron.daily
、/etc/cron.weekly
、および /etc/cron.monthly} 内のファイルを実行することにより、同様に機能します。
ディレクトリは、目的のジョブ頻度に応じてそこに配置されます。cron ジョブ /etc/cron.hourly/0anacron
は、保留中のタスクを実行するために anacron が 1日1回実行されるようにします。
Dcron
cron デーモンは crontab
という名前の設定ファイルをパースします。各ユーザーは別々の crontab ファイルを使うことで別個にコマンドを実行することができます。root ユーザーの crontab はシステム全体のコマンドのスケジュールを組みために使います (cron の実装によっては、ユーザーが /etc/crontab
や /etc/cron.d
ディレクトリを使うことができる場合もあります)。
/var/spool/cron/root
# Run command at a scheduled time # Edit this 'crontab -e' for error checking, man 1 crontab for acceptable format # <@freq> <tags and command> @hourly ID=sys-hourly /usr/sbin/run-cron /etc/cron.hourly @daily ID=sys-daily /usr/sbin/run-cron /etc/cron.daily @weekly ID=sys-weekly /usr/sbin/run-cron /etc/cron.weekly @monthly ID=sys-monthly /usr/sbin/run-cron /etc/cron.monthly # mm hh DD MM W /path/command (or tags) # W = week: 0-6, Sun=0 21 01 * * * /usr/bin/systemctl suspend
以下の行は crontab エントリのフォーマットの例です。空白で区切られたフィールドに以下を指定します:
- @period
- ID=jobname (this tag is specific to dcron)
- command
crontab エントリの他の標準フォーマット:
- minute
- hour
- day
- month
- day of week
- command
crontab ファイルは通常 /var/spool/cron/username
に保存され、root の crontab ファイルは /var/spool/cron/root
になります。
詳しい情報や設定例は crontab の man ページを見てください。