systemdのユニットを定期的に再起動するために
- 再起動用のサービスユニット
- 上記ユニットのタイマーユニット
を作成し、ついでに実行時にwebhookを使ってDiscordに通知を飛ばす
- Indigo(6vCPU, 8GB)上のUbuntu 18.04で動かしています。
- 今回定期的に再起動したいサービスユニットは、ARKのプライベートサーバ
- 上記のサービスユニットをこの記事では(wikiと同じく)
ark-dedicated.service
という名前で登録しています。別名で登録している場合や別のユニットを対象とする場合は適宜読み替えてください。 - systemdまわりめちゃくちゃ浅い理解で書いてます。
- コケたときのことはなにも考えてません。
[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
いちいち再起動するよーとかしたよーとか言うのもめんどうなので。
通知をしたいDiscordサーバのサーバ設定→ウェブフック
からウェブフックを作り、webhook URLを取得します。
とりあえず下記コマンドで雑にメッセージを投げてみる。
curl -X POST -H 'Content-Type: application/json' -d '{"content" : "test"}' webhookのurl
restart-ark-dedicated.service
を再び編集し、ExecStartPre
でExecStart
の実行前に、ExecStartPost
でExecStart
の実行後に走らせるコマンドをそれぞれ指定します。
[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時間前に通知するようにしましょう。