クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

常駐させて定期的に動かす(systemd、cron)

このレッスンのあとで: プログラムをサービスとして動かし、仕事をスケジュールすることができる。

55分のレッスンコマンド8件Linux 管理のラボ:ユーザー、権限、cron、systemd をブラウザーで

誰も実行しなかった月曜のレポート

ある店は、毎週月曜の朝6時に在庫レポートを作りたいと考えていました。数か月のあいだ、忙しい担当者が毎週手で実行していました。

ある月曜、その人が病気で休み、レポートは出ませんでした。

くり返しの仕事は、マシンにさせるものです。大事なプログラムを動かし続けるのも、人の手を借りずにやらせます。

このレッスンのゴール

メモ

プログラムをサービスとして動かし、仕事をスケジュールすることができる。

キーワード

ことばいみれい
サービスシステムが裏で動かし続けるプログラム
systemdサービスを起動して見守るプログラムsystemctl
ユニットファイル1つのサービスをsystemdに伝える小さなファイル
cron決めた時刻に仕事を実行するプログラム
cronジョブ時刻とコマンドを書いた1行15 6 * * 1

学生が入力するセルは、このプレビューでは空白です。

systemd がサービスを動かす

サービスとは、Webサーバやメール送信のように、いつも動いているべきプログラムです。Ubuntuでは、systemdが起動時にそれを始め、見守ります。

systemctl は、systemdと話すためのコマンドです。動いているか(is-active)と、起動時に始まるか(is-enabled)を尋ねられます。

cron は動いているか

コマンド
systemctl is-active cron

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

起動時に始まるか

コマンド
systemctl is-enabled cron

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

全体の様子

コマンド
systemctl status cron --no-pager

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

systemd が読む cron のユニットファイル

コマンド
systemctl cat cron --no-pager

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

例: systemctl の動詞

コマンド働き再起動後も残るか
systemctl start mailer今すぐ始める残らない
systemctl stop mailer今すぐ止める残らない
systemctl restart mailer止めて、また始める残らない
systemctl enable mailer起動時に始まるようにする残る
systemctl disable mailer起動時に始まらないようにする残る

学生が入力するセルは、このプレビューでは空白です。

ユニットファイルは3つの部分

ユニットファイルは、ふつうのテキストです。自分で書くものは /etc/systemd/system に、パッケージが入れるものは /usr/lib/systemd/system に置かれます。[Unit] はサービスの説明です。

[Service] は、ExecStart で何を動かすか、Restart で失敗後に戻すかを書きます。[Install] は、いつ始めるかを書きます。

次のブロックは、shop-mailer というプログラムの例です。

別のプログラムのユニットファイル

コード: bash
[Unit]
Description=店のメール送信プログラム

[Service]
ExecStart=/usr/local/bin/shop-mailer
Restart=on-failure

[Install]
WantedBy=multi-user.target

よくある間違い

注意

「systemctl start をすれば、再起動のあとも動く」と考える人が多くいます。実際は違います。start は今、動かします。enable は起動時に始まるようにします。両方いるサービスには、両方行います。

cron は決めた時刻にコマンドを動かす

cronの1行には、時刻の欄が5つあり、そのあとにコマンドが続きます。欄は、分、時、日、月、曜日の順です。

星の * は「毎回」です。分の欄の */10 は「10分ごと」で、0分、10分、20分…に動きます。数字は、その値のときだけ動くという意味です。

例: cronの時刻の読み方

欄実行されるとき
15 6 * * 1毎週月曜の6時15分
0 * * * *毎時0分
*/10 * * * *10分ごと
0 9 1 * *毎月1日の9時
30 23 * * 5毎週金曜の23時30分

学生が入力するセルは、このプレビューでは空白です。

自分のジョブの一覧

コマンド
crontab -l

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

cronの2行の例

コード: bash
# 分 時 日 月 曜日 ユーザー コマンド
15 6 * * 1 root /usr/local/bin/weekly-report.sh
*/10 * * * * root /usr/local/bin/sync-stock.sh

システムのフォルダは欄が1つ多い

crontab -l が見せる自分の一覧は、5つの時刻のあとにコマンドが続きます。

/etc/cron.d のファイルには、時刻とコマンドのあいだに、実行するユーザーの欄があります。

cron は、決まりに合わないファイルを飛ばします。持ち主が root で、root 以外は誰も書けないこと(グループも不可)が必要です。名前に . を含めてはいけません。report.cron は動きません。最後の行も改行で終えます。

システムのジョブのフォルダ

コマンド
ls -l /etc/cron.d

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

登録を待つスクリプト

コマンド
cat /usr/local/bin/backup.sh

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

systemd には専用のタイマーもある

コマンド
systemctl list-timers --no-pager

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

もっと先へ

平日だけ、朝7時45分に /usr/local/bin/open-shop.sh を root で動かす /etc/cron.d の1行を書きましょう。曜日の欄には 1-5 のような範囲が書けます。

金曜の23時に、このジョブが次に動くのは何曜日の何時かを答えましょう。

このラボとソースについて: Linux 管理のラボ:ユーザー、権限、cron、systemd をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。