誰も実行しなかった月曜のレポート
ある店は、毎週月曜の朝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 というプログラムの例です。
別のプログラムのユニットファイル
[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行の例
# 分 時 日 月 曜日 ユーザー コマンド
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時に、このジョブが次に動くのは何曜日の何時かを答えましょう。