定期タスクに systemd タイマーを設定する
このステップでは、Linux システムでタスクをスケジュールするためのcronの最新の代替手段であるsystemdタイマーについて学びます。systemdタイマーは、より柔軟性があり、systemdエコシステムとのより良い統合を提供します。systemctlコマンドは通常、systemdユニットを管理するために使用されますが、Docker コンテナ環境のため、タイマーとサービスユニットファイルを直接作成して検証することに焦点を当てます。
systemdタイマーは、systemdサービスユニットと連携して動作します。タイマーユニット(.timerファイル)は、タスクを実行するタイミングを定義し、サービスユニット(.serviceファイル)は、実行するタスクを定義します。
systemd タイマーの設定を探索するために、ローカルシステムで引き続き作業します。
システムディレクトリにsystemdユニットファイルを作成するには、root 権限が必要です。labex ユーザーには sudo アクセス権があるため、必要なコマンドにsudoを使用できます。
ファイルにメッセージを記録するシンプルなサービスを作成しましょう。このサービスユニットファイルを、カスタムサービスユニットが通常保存される/etc/systemd/system/に配置します。
サービスユニットファイル/etc/systemd/system/my-custom-task.serviceを作成します。
sudo nano /etc/systemd/system/my-custom-task.service
ファイルに次の内容を追加します。
[Unit]
Description=My Custom Scheduled Task
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo "My custom task executed at $(date)" >> /var/log/my-custom-task.log'
エディタを保存して終了します(nanoでCtrl+o、Enter、Ctrl+x)。
次に、タイマーユニットファイル/etc/systemd/system/my-custom-task.timerを作成します。このタイマーは、5 分ごとにサービスをアクティブ化します。
sudo nano /etc/systemd/system/my-custom-task.timer
ファイルに次の内容を追加します。
[Unit]
Description=Run My Custom Scheduled Task every 5 minutes
[Timer]
OnCalendar=*:0/5
Persistent=true
[Install]
WantedBy=timers.target
エディタを保存して終了します。
OnCalendarの説明:
*:0/5は「5 分ごと」を意味します。
*は年、月、日、時(任意の値)を表します。
0/5は分を表し、0 分から始めて 5 分ごと(0、5、10、...、55)を意味します。
一般的なsystemd環境では、新しいユニットファイルをsystemdに認識させるためにsystemctl daemon-reloadを実行し、次にタイマーを開始するためにsystemctl enable --now my-custom-task.timerを実行します。ただし、Docker コンテナの制限により、systemctlは完全に機能していません。
代わりに、ファイルの作成を手動で検証します。コンテナ内のsystemdデーモンは最終的にこれらのファイルを取得する可能性がありますが、この実験設定では、そのタイマーの実行を直接制御または観察することはできません。ここでの主な目的は、これらのファイルを設定する方法を理解することです。
作成したファイルの存在を確認しましょう。
ls -l /etc/systemd/system/my-custom-task.service
ls -l /etc/systemd/system/my-custom-task.timer
両方のファイルが存在することを示す出力が表示されるはずです。
サービスの実行をシミュレートするには、ExecStartで定義されたコマンドを手動で実行できます。
sudo /bin/bash -c 'echo "My custom task executed at $(date)" >> /var/log/my-custom-task.log'
次に、ログファイルを確認して、出力を確認します。
sudo cat /var/log/my-custom-task.log
先ほどログに記録したメッセージが表示されるはずです。
My custom task executed at Tue Jun 10 06:54:40 UTC 2025
これで、systemd タイマー設定ステップが完了しました。サービスとタイマーユニットファイルは、参照のためにそのまま残ります。