「Systemd/タイマー」の版間の差分
細 |
|||
12行目: | 12行目: | ||
{{Related|cron}} |
{{Related|cron}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
− | タイマーは名前が {{ic|.timer}} で終わる [[ |
+ | タイマーは名前が {{ic|.timer}} で終わる [[systemd]] のユニットファイルであり、{{ic|.service}} ファイルやイベントを制御します。[[cron]] の代わりとしてタイマーを使うことができます ([[#cron を置き換える]] を読んで下さい)。タイマーにはカレンダー時刻のイベントとモノトニック時刻のイベントのサポートが入っており、さらに非同期に実行することも可能です。 |
== タイマーユニット == |
== タイマーユニット == |
||
18行目: | 18行目: | ||
タイマーは拡張子が {{ic|.timer}} の ''systemd'' のユニットファイルです。他の[[systemd#カスタム .service ファイルを書く|ユニット設定ファイル]]と似ていますが特別に {{ic|[Timer]}} セクションが存在します。{{ic|[Timer]}} セクションにはタイマーが作動する時間と処理を定義します。タイマーには2つのタイプがあり、どちらか一つを使って定義されます: |
タイマーは拡張子が {{ic|.timer}} の ''systemd'' のユニットファイルです。他の[[systemd#カスタム .service ファイルを書く|ユニット設定ファイル]]と似ていますが特別に {{ic|[Timer]}} セクションが存在します。{{ic|[Timer]}} セクションにはタイマーが作動する時間と処理を定義します。タイマーには2つのタイプがあり、どちらか一つを使って定義されます: |
||
− | * '''モノトニックタイマー'''は刻々と変わる開始点と相応したタイムスパンの後に作動します。様々なモノトニックタイマーが存在しますがどれも次のような形式です: {{ic|1=On''Type''Sec=}}。{{ic|OnBootSec}} と {{ic|OnActiveSec}} は全てのモノトニックタイマーで共通で |
+ | * '''モノトニックタイマー'''は刻々と変わる開始点と相応したタイムスパンの後に作動します。様々なモノトニックタイマーが存在しますがどれも次のような形式です: {{ic|1=On''Type''Sec=}}。{{ic|OnBootSec}} と {{ic|OnActiveSec}} は全てのモノトニックタイマーで共通です。 |
− | * '''リアルタイムタイマー''' (別名ウォールクロックタイマー) は (cron のジョブと同じように) カレンダーイベントにあわせて作動します。{{ic|1= |
+ | * '''リアルタイムタイマー''' (別名ウォールクロックタイマー) は (cron のジョブと同じように) カレンダーイベントにあわせて作動します。{{ic|1=OnCalendar=}} オプションを使って定義を行います。 |
+ | |||
+ | タイマーのオプションについては {{ic|systemd.timer(5)}} の [[man ページ]]で説明されています。カレンダーイベントやタイムスパンの引数構文については {{ic|systemd.time(7)}} の [[man ページ]]で説明されています。 |
||
== サービスユニット == |
== サービスユニット == |
||
35行目: | 37行目: | ||
}} |
}} |
||
+ | {{Note| |
||
− | {{Note|タイマーによって実行するサービスの状態は、今現在作動しているのでない限り、inactive になります。そして {{ic|/var/lib/systemd/timers}} ディレクトリの {{ic|stamp-*}} ファイルを使って ''systemd'' は {{ic|LAST}} フィールドの情報を管理します。長さゼロのファイルで時刻フィールドを使用します。タイマーがズレる場合は、この stamp ファイルを削除することでタイマーの次の作動時に systemd が再構成を行います。}} |
||
+ | * タイマーによって実行するサービスの状態は、今現在作動しているのでない限り、inactive になります。 |
||
+ | * タイマーがズレる場合は、{{ic|/var/lib/systemd/timers}} にある {{ic|stamp-*}} ファイルを削除してみてください。stamp ファイルはタイマーが実行された最後の時刻を記録しており、ファイルを削除することでタイマーの次の作動時に systemd が再構成を行います。 |
||
+ | }} |
||
== サンプル == |
== サンプル == |
||
+ | タイマーを使用してサービスを実行するのにあたって、service ユニットファイルに変更を加える必要はありません。以下の例では {{ic|foo.timer}} という名前のタイマーを使って {{ic|foo.service}} を定期的に実行します。 |
||
− | 以下はサンプルのタイマー、''service'' ユニットです。バックアップスクリプトのサービスです: |
||
+ | === モノトニックタイマー === |
||
− | {{hc|/etc/systemd/system/mybackup.service|<nowiki> |
||
− | [Unit] |
||
− | Description=Full system backup |
||
− | |||
− | [Service] |
||
− | Nice=19 |
||
− | IOSchedulingClass=2 |
||
− | IOSchedulingPriority=7 |
||
− | ExecStart=/path/to/mybackup/script |
||
− | </nowiki>}} |
||
− | |||
− | === リアルタイムタイマー === |
||
+ | 起動15分後に実行され、システムが起動している間、一週間ごとに再度実行されるタイマー: |
||
− | カレンダーイベントにあわせてバックアップを実行したい場合は、{{ic|OnCalendar}} オプションを使います: |
||
− | {{hc|/etc/systemd/system/ |
+ | {{hc|/etc/systemd/system/foo.timer|<nowiki> |
[Unit] |
[Unit] |
||
− | Description=weekly |
+ | Description=Run foo weekly and on boot |
[Timer] |
[Timer] |
||
+ | OnBootSec=15min |
||
− | OnCalendar=weekly |
||
+ | OnUnitActiveSec=1w |
||
− | Persistent=true |
||
[Install] |
[Install] |
||
68行目: | 62行目: | ||
</nowiki>}} |
</nowiki>}} |
||
+ | === リアルタイムタイマー === |
||
− | {{Tip|Shortcuts like {{ic|daily}} and {{ic|weekly}} refer to ''specific start times'' and thus any timers sharing such calendar events will start simultaneously. This can cause poor performance if the timers' services compete for system resources. Consider using more specific calendar events, which can be manually staggered (e.g. {{ic|OnCalendar=Wed, 23:15}}).}} |
||
+ | 一週間ごとに起動するタイマー (月曜日の午前12:00に実行)。システムの電源が切られていたなどの理由で、最後の起動時間を過ぎていた場合、すぐに実行されます ({{ic||1=Persistent=true}} オプション): |
||
− | === モノトニックタイマー === |
||
+ | {{hc|/etc/systemd/system/foo.timer|<nowiki> |
||
− | また、システムが起動する時に、一週間ごとに再起動でバックアップを実行したい場合、{{ic|OnBootSec}} を {{ic|OnUnitActiveSec}} と組み合わせます: |
||
− | |||
− | {{hc|/etc/systemd/system/mybackup.timer|<nowiki> |
||
[Unit] |
[Unit] |
||
− | Description= |
+ | Description=Run foo weekly |
[Timer] |
[Timer] |
||
+ | OnCalendar=weekly |
||
− | OnBootSec=15min |
||
+ | Persistent=true |
||
− | OnUnitActiveSec=1w |
||
+ | |||
− | |||
[Install] |
[Install] |
||
− | WantedBy=timers.target |
+ | WantedBy=timers.target</nowiki>}} |
− | </nowiki>}} |
||
+ | {{Tip|{{ic|daily}} や {{ic|weekly}} などの特殊なイベントの表現は''特定の起動時間''を示しているため、同じカレンダーイベントが設定されているタイマーがあった場合、同時に起動します。そのようなことが発生すると、タイマーのサービスがシステムリソースを取り合って、システムパフォーマンスが落ち込む可能性があります。{{ic|1=OnCalendar=Wed, 23:15}} のような特定のイベントで起動するタイマーを使うときはよく考えてからにしてください。[[#注意事項]]を参照。}} |
||
− | {{Tip|リソースを消費するサービスでは、起動してすぐにタイマーを設定しないでください。ログインや X セッションに遅延が発生する可能性があります。}} |
||
== cron を置き換える == |
== cron を置き換える == |
||
− | おそらく [[ |
+ | おそらく [[cron]] が一番有名なジョブスケジューラですが、''systemd'' のタイマーはその代替手段になりえます。 |
=== メリット === |
=== メリット === |
2015年3月15日 (日) 00:02時点における版
タイマーは名前が .timer
で終わる systemd のユニットファイルであり、.service
ファイルやイベントを制御します。cron の代わりとしてタイマーを使うことができます (#cron を置き換える を読んで下さい)。タイマーにはカレンダー時刻のイベントとモノトニック時刻のイベントのサポートが入っており、さらに非同期に実行することも可能です。
目次
タイマーユニット
タイマーは拡張子が .timer
の systemd のユニットファイルです。他のユニット設定ファイルと似ていますが特別に [Timer]
セクションが存在します。[Timer]
セクションにはタイマーが作動する時間と処理を定義します。タイマーには2つのタイプがあり、どちらか一つを使って定義されます:
- モノトニックタイマーは刻々と変わる開始点と相応したタイムスパンの後に作動します。様々なモノトニックタイマーが存在しますがどれも次のような形式です:
OnTypeSec=
。OnBootSec
とOnActiveSec
は全てのモノトニックタイマーで共通です。 - リアルタイムタイマー (別名ウォールクロックタイマー) は (cron のジョブと同じように) カレンダーイベントにあわせて作動します。
OnCalendar=
オプションを使って定義を行います。
タイマーのオプションについては systemd.timer(5)
の man ページで説明されています。カレンダーイベントやタイムスパンの引数構文については systemd.time(7)
の man ページで説明されています。
サービスユニット
それぞれの .timer
ファイルには、対応する .service
ファイルが存在します (例: foo.timer
と foo.service
)。.timer
ファイルは .service
ファイルを作動・制御します。.service
に [Install]
セクションは必要ありません。有効にするのは timer ユニットだからです。必要ならば、タイマーの [Timer]
セクションで Unit=
オプションを使うことで別の名前のユニットを制御することもできます。
管理
timer ユニットを使用するには、他のユニットと同じように有効化・起動します。起動しているタイマーを全て表示するには、次を実行:
$ systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES Thu 2014-07-10 19:37:03 CEST 11h left Wed 2014-07-09 19:37:03 CEST 12h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service Fri 2014-07-11 00:00:00 CEST 15h left Thu 2014-07-10 00:00:13 CEST 8h ago logrotate.timer logrotate.service
サンプル
タイマーを使用してサービスを実行するのにあたって、service ユニットファイルに変更を加える必要はありません。以下の例では foo.timer
という名前のタイマーを使って foo.service
を定期的に実行します。
モノトニックタイマー
起動15分後に実行され、システムが起動している間、一週間ごとに再度実行されるタイマー:
/etc/systemd/system/foo.timer
[Unit] Description=Run foo weekly and on boot [Timer] OnBootSec=15min OnUnitActiveSec=1w [Install] WantedBy=timers.target
リアルタイムタイマー
一週間ごとに起動するタイマー (月曜日の午前12:00に実行)。システムの電源が切られていたなどの理由で、最後の起動時間を過ぎていた場合、すぐに実行されます (Persistent=true
オプション):
/etc/systemd/system/foo.timer
[Unit] Description=Run foo weekly [Timer] OnCalendar=weekly Persistent=true [Install] WantedBy=timers.target
cron を置き換える
おそらく cron が一番有名なジョブスケジューラですが、systemd のタイマーはその代替手段になりえます。
メリット
タイマーを使う主要なメリットは、それぞれのジョブが固有の systemd サービスを使うというところに根ざします。そのメリットには以下のようなものがあります:
- タイマーとは別個にジョブを実行することが簡単にできます。これによってデバッグが楽になります。
- 特定の環境で動作するようにジョブを設定することができます (
systemd.exec(5)
man ページを参照)。 - ジョブを cgroups の支配下に置けます。
- 他の systemd ユニットに依存するようにジョブを設定できます。
- systemd の journal でジョブが記録されるのでデバッグが簡単です。
注意事項
- 冗長性: systemd を使って定期的なジョブを設定するには2つのファイルを作成して2回
systemctl
コマンドを実行します。それに対して crontab には一行を追加するだけです。crontab を使って定期的なサービスを管理するツールとして systemd-crontab-generatorAUR と systemd-cronAUR があります。もし、スケジュールされたジョブをまとめて見れるから crontab が好きだという場合は、systemctl
でそれと同じことが可能です。#管理 を見て下さい。 - メール: ジョブが失敗した時にメールを送信する cron の
MAILTO
と同等なものは存在しません。各サービスにOnFailure=
オプションを使うことで同じような機能を設定することはできます。 - ランダム遅延: インターバルを指定してタイマーの実行をランダムに分散する cron の
RANDOM_DELAY
と同じ機能はありません (バグレポートを参照)。同時に実行して欲しくないサービスには、手動でオーバーラップを少なくするようにタイマーを設定する必要があります。
タイマーを自動的にずらすには AccuracySec
オプションが役に立つかもしれません。ただし"全てのローカルなタイマーユニット間で同期が行われる"ので注意してください (systemd.timer(5)
)。言い換えれば、AccuracySec
は全てのタイマーの作動時間を同じ分だけずらします。例えば、AccuracySec=15m
を使っている OnCalendar=daily
のタイマーユニットは全て、00:00 から 00:15 の間の同一時刻に関連するサービスを起動します。
参照
- systemd.timer man page on freedesktop.org
- Fedora Project wiki の systemd カレンダータイマーのページ
- Gentoo wiki の systemd タイマーサービスのセクション
- systemd-crontab-generator — crontab と anacrontab ファイルからタイマーとサービスを生成するツール
- systemd-cron — cron スクリプトを実行する systemd ユニットが入っています。systemd-crontab-generator を使って crontab を変換。