Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

Slack で打刻忘れを防ぐには ~後編~

はじめに

前回は Slack の通知をセットアップするところまでの手順でした。

前回の記事: Slack で打刻忘れを防ぐには ~前編~

Slack 通知のための Webhook URL が払い出されていると思います。 この Webhook URL を、OS(Linux)のシャットダウンの際に方法、をここに記します。

方法

順を追って説明します。

  1. systemd のユニットファイルを書く

下記のユニットファイルを ~/.config/systemd/user/clockout.service として保存します。

[Unit]
Description=Clockout Service
After=network.target

[Service]
ExecStop=/usr/bin/sh -c "~/.local/bin/clockout.sh"
RemainAfterExit=yes

[Install]
WantedBy=default.target

これは、network.target が終了する前に ~/.local/bin/clockout.sh を実行するように定義したユニットファイルです。~/.local/bin/clockout.sh では curl を使用するのでネットワークが終了する前でなくてはなりません。shutdown.target ではなく、network.target に依存しているのはそのためです。

  1. Slack 通知するためのスクリプトを書く

  2. のユニットファイルから実行されるスクリプトを書きます。下記のスクリプト~/.local/bin/clockout.sh として保存します。

#!/bin/bash

jobs=$(systemctl list-jobs --no-legend)

if echo "${jobs}" | grep -q "shutdown.target"; then
  if ! echo "${jobs}" | grep -q "reboot.target"; then
    curl -X POST -H 'Content-type: application/json' --data '{"text":"打刻してね! :wink:"}' <生成された Webhook URL>
  fi
fi

Slack 通知用の Webhook URL に POST していますが、POST 前に 2 つの分岐があります。これは systemd のジョブを参照して、

  1. シャットダウン中であるか?
  2. 再起動ではないか?

をチェックしています。reboot の際にも network.target はいったん終了します。就業中に reboot することもあるので、そのたびに通知されるのを避けるための判断です。

  1. systemd を有効化する
systemctl --user enable clockout.service

これで完了です。

有効化した直後の shutdown ではまだ通知されません。clockout.service がまだ inactive 状態だからです。次回起動時から有効になります。