Jan 5, 2021
ssytemdのservice, timerについてなど.
デーモンを作成する場合は, 次のように作成する. ここでは/var/www/test.binを実行するとする. デーモンでは実行ユーザーを指定したい場合が多いが, Userで指定できる. サーバーが再起動したらデーモンも起動して欲しい時はRestartを使う.
[Unit]
Description=systemd daemon test
[Service]
User = http
ExecStart = /var/www/test.bin
Type=simple
Restart = always
[Install]
WantedBy=multi-user.target
作成したら, enableで自動起動に登録, startで開始.
sudo systemctl enable test
sudo systemctl start test
systemdはcrontabと違って.serviceとは別に.timerも作らなくてはならない. ここがやや不評な理由になっているがメリットもあるらしい.
まず, serviceを作る. Typeをoneshotにすること.
[Unit]
Description = systemd test
[Service]
Type=oneshot
ExecStart = /usr/bin/bash /home/zaief/test.bin
User=http
[Install]
WantedBy = multi-user.target
enableのみ実行する.
sudo systemctl enable test
/etc/systemd/systemにtest.timerを作成し次のように記述する. OnCalendarの書式は, 西暦-月-日 時:分:秒の順に当てはまる数字を書く. *とすると毎ということになる. 下記の内容の場合, 毎年, 毎月1日に実行することになる. 00:00:00は0時0分0秒に実行する, ということだ. Persistent=trueでサービス起動後から, 指定した時間にシャットダウン状態などで実行できなかった場合起動後すぐ実行する.
[Unit]
Description=Once a month renewal of Let's Encrypt's certificates
[Timer]
OnCalendar=*-*-01 00:00:00
Persistent=true
[Install]
WantedBy=timers.target
timerをenable, startする.
systemctl enable /etc/systemd/system/test.timer
systemctl start /etc/systemd/system/test.timer
OnCalenderは日付指定によるタイマーだったが, 間隔指定ならばOnUnitActiveSecを使う. 次のように設定すると1時間に一回実行する.
[Timer]
OnUnitAcxtiveSec=1h
Persistent=true
ログは, journalctlを使って確認できる.
journalctl -f -u test.service
https://wiki.archlinux.jp/index.php/Systemd/タイマー
systemd サービスユニット覚書 とても詳しい.