blog(unstable)

systemctl timer unitを使ってcronを置き換えたときのメモ

June 17, 2020

category : 技術

tags :


移植 : https://gist.github.com/kei-s16/eb5eb5f6657e17eb8e9a422c167e62e0


概略

systemdのユニットを定期的に再起動するために

を作成し、ついでに実行時にwebhookを使ってDiscordに通知を飛ばす

前提とかおことわりとか

まずは定期的に再起動するように

再起動用のサービスユニットを作る

[Unit]
Description=Restart ark-dedicated.service

[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart ark-dedicated.service

タイマーユニットを作る

今回は誰も遊んでいないであろう毎週水曜日正午に再起動処理を実行することにします。

[Unit]
Description=Restart ark-dedicated.service every wednesday

[Timer]
OnCalendar=Wed 12:00
Persistent=True

[Install]
WantedBy=timers.target

webhookで通知する

いちいち再起動するよーとかしたよーとか言うのもめんどうなので。

まずは試してみる

通知をしたいDiscordサーバのサーバ設定→ウェブフックからウェブフックを作り、webhook URLを取得します。

とりあえず下記コマンドで雑にメッセージを投げてみる。

curl -X POST -H 'Content-Type: application/json' -d '{"content" : "test"}' webhookのurl

再起動の開始と終了に合わせて通知を飛ばす

restart-ark-dedicated.serviceを再び編集し、ExecStartPreExecStartの実行前に、ExecStartPostExecStartの実行後に走らせるコマンドをそれぞれ指定します。

[Unit]
Description=Restart ark-dedicated.service

[Service]
Type=oneshot
ExecStartPre=/usr/bin/curl -X POST -H 'Content-Type: application/json' -d '{"content" : "[定期]サーバ再起動開始"}' webhookのurl
ExecStart=/bin/systemctl try-restart ark-dedicated.service
ExecStartPost=/usr/bin/curl -X POST -H 'Content-Type: application/json' -d '{"content" : "[定期]サーバ再起動完了"}' webhookのurl

おわりに

このままだと再起動開始通知から速攻で再起動処理が動くのであんまりよくない。 人に優しくありたいなら30分とか1時間前に通知するようにしましょう。

参考