cronの出力をメールでなくSlackに送る方法

  • 9
    Like
  • 0
    Comment

概要:crondのオプションでsendmailの代わりに独自スクリプトのパスを指定する

crondにはcronie, fcron, vixie-cronと色々種類があり、対応オプションも違うと思う。ここではcronieを使っているものとする。

sendmailの代替スクリプトを作成(urlを自分のIncoming WebhookのURLで置き換えること)

/usr/bin/sendmail.slack
#!/usr/bin/env ruby

require "json"
require "faraday"

url = "***** SlackのIncoming WebhookのURL *****"

message = $stdin.read

payload =
{
    "channel": "#general",
    "username": "sendmail.slack",
    "text": message,
}

res = Faraday.post url, JSON.generate(payload), content_type: "application/json"
puts res.status
puts res.body

faradayを使っているので

gem install faraday

としておいてください。

systemctl edit cronie
/etc/systemd/system/cronie.service.d/override.conf
[Service]
# ↓既存のExecStart=を上書きするには、これでクリアする必要がある。
ExecStart=
ExecStart=/usr/bin/crond -n -m /usr/bin/sendmail.slack
systemctl daemon-reload
systemctl reload cronie

ps aux | grep crond

### crond が /usr/bin/crond -n -m /usr/bin/sendmail.slack で起動していることを確認

以上。

journalctl -u cronie -fしつつ適用にcronジョブを設定して動作確認。

追記

よく考えたら、ジョブの指定で末尾に

2>&1 | /usr/bin/sendmail.slack

とする方法でもよかったかもしれない。