コース一覧
LinuC レベル1 102試験対策(LPIC-1対応)
systemdタイマー

LinuC レベル1 102試験対策(LPIC-1対応)

LinuC レベル1/LPIC-1の102範囲を、シェル、ユーザーとセキュリティ、ネットワーク、システム管理の実機演習と章末問題で固めます。Linuxを安全に運用するための知識とコマンド操作を体系的に身につける25レッスンのコースです。

1
102 シェルとスクリプト
01. シェル環境18分
02. testと条件式18分
03. スクリプトの制御18分
04. cronとat15分
05. systemdタイマー18分
06. 過去問 シェル15分
2
102 ユーザーとセキュリティ
01. passwdとshadow18分
02. ユーザー管理コマンド18分
03. suとsudo18分
04. 特殊パーミッション18分
05. ホストのセキュリティ18分
06. SSHとGPG18分
07. 過去問 ユーザーとセキュリティ15分
3
102 ネットワーク
01. TCP/IPとウェルノウンポート18分
02. アドレス設定18分
03. ルーティング18分
04. 名前解決の設定18分
05. 疎通トラブルシュート18分
06. 過去問 ネットワーク15分
4
102 システム管理
01. 時刻とNTP15分
02. ロケールと文字コード18分
03. ログ管理18分
04. サービス管理の試験形式18分
05. メールと印刷のきほん15分
06. 過去問 システム管理15分

systemdタイマー

前のレッスンでは cron が入っておらず実機で試せませんでしたが、この機械では systemd タイマーが本当に動きます。systemctl list-timers を打てば apt-daily.timer などが現に動いているのが見えます。定期実行の感覚は、ここで手を動かしてつかんでください。

「いつ」と「何を」が別のファイルに分かれる

cron では1行に「いつ」と「何を」の両方を書きました。systemd はこれを2つに分け、いつ実行するかを .timer の OnCalendar などに、何を実行するかを .service の ExecStart に書きます。

拡張子より前の名前を揃えるのが基本です。backup.timer は既定で backup.service を起動します。別の名前のサービスを起こしたいときだけ、[Timer] セクションに Unit= を書いて明示します。

置き場所は、管理者が自分で作るユニットなら /etc/systemd/system/ です。パッケージ提供のものは /lib/systemd/system/ にあり、同名を /etc/systemd/system/ に置くとそちらが優先されます。

サービス側は [Unit] に Description=、[Service] に Type=oneshot と ExecStart= を書きます。oneshot は一度走って終わる処理を表し、付けないと systemd がプロセスの終了を異常とみなすことがあります。タイマーから起動されるサービスには [Install] を書かず、enable もしません。起動はタイマーに任せるからです。

OnCalendar は 年-月-日 のあとに 時-分-秒

基本の形は曜日と年-月-日と時-分-秒です。曜日は省略でき、* は cron と同じく「すべて」です。

書き方いつ
*-*-* 03:00:00毎日 3時
*-*-* *:00:00毎正時
Mon..Fri *-*-* 09:00:00平日の 9時
*-*-* *:0/15:0015分おき

hourly daily weekly monthly yearly という短縮語も使えます。書式に自信がないときは次のコマンドで確かめられます。次に実行される時刻まで出るので、覚え違いをその場で見つけられます。

ターミナル

systemd-analyze calendar 'Mon..Fri *-*-* 09:00:00'

タイマー側は [Timer] に OnCalendar= を、[Install] に WantedBy=timers.target を書きます。この WantedBy は決まり文句で、無いと enable しても起動時に有効になりません。

出来事からの経過時間でも指定できる

絶対時刻ではなく、ある出来事からの経過時間でも指定できます。OnBootSec= は起動から、OnActiveSec= はタイマーが有効になってから、OnUnitActiveSec= は対象サービスが最後に起動してから、OnUnitInactiveSec= は最後に終了してからの経過時間です。

OnBootSec=5min と OnUnitActiveSec=1h を組み合わせると、起動5分後に初回、その後は1時間おき、という動きになります。cron には無い表現で、起動直後の混雑を避けたいときに使います。

また、電源が入っていなくて飛んだ回を取り返したいときは Persistent=true を書きます。cron では anacron が要りましたが、systemd はこの1行です。最後に実行した時刻が記録され、次の起動時に本来なら実行されているはずだったと判断されればすぐ走ります。

enable は次回から、start は今すぐ

ファイルを置いただけでは systemd はそれを知りません。読み直させてから有効にします。

ターミナル

systemctl daemon-reload             # ユニットファイルを読み直す
systemctl enable --now sample.timer # 起動時に有効化し、いま起動もする
systemctl list-timers --all         # 停止中を含めてタイマーの一覧

enable は次回の起動から、start はいま、--now は両方、という区別は必ず問われます。有効にするのは .timer のほうで、.service を enable するのではありません。

実行結果は journald に集まります。cron のようにメールの設定に左右されず、journalctl -u sample.service のようにユニット名で絞り込めるのが利点です。

試験で狙われるところ

.timer と .service は対で、.timer だけでは何も実行されません。有効化するのは .timer のほうです。ユニットファイルを置いたら daemon-reload が要ります。Persistent=true は取りこぼしの救済であって、遅延実行の指定ではありません。

ヒント

ファイルはヒアドキュメントで書けます。cat <<'EOF' > /etc/systemd/system/linuc-report.service で始め、最後に EOF だけの行で閉じます

service には [Unit] と [Service] の2つ、timer には [Unit] と [Timer] と [Install] の3つのセクションを書きます。timer の [Install] を忘れると enable が失敗します

ファイルを置いたら必ず systemctl daemon-reload です。そのあと systemctl enable --now linuc-report.timer で有効化と起動を一度に行えます

  • 1. cat <<'EOF' > /etc/systemd/system/linuc-report.service で service ファイルを書く。[Service] に Type=oneshot と ExecStart を書く
  • 2. cat <<'EOF' > /etc/systemd/system/linuc-report.timer で timer ファイルを書く。[Timer] に OnCalendar=*-*-* *:*:00、[Install] に WantedBy=timers.target を書く
  • 3. systemd-analyze calendar '*-*-* *:*:00' で書式が正しいか確かめる
  • 4. systemctl daemon-reload でユニットファイルを読み直させる
  • 5. systemctl enable --now linuc-report.timer で有効化して起動する
  • 6. systemctl list-timers で自分のタイマーが並んでいるのを確かめる
  • 7. journalctl -u linuc-report.service で実行結果を見る

Linux は使うときに起動します(初回は約102MB通信します)

7 項目で採点します