1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

時間のかかるコマンドが終了したらSlackに通知

Last updated at Posted at 2022-03-03

実行に長時間かかるコマンドをよく実行する場合に便利。

研究で数時間かかるスクリプトを回しがちで、終了したら教えてほしかったので作った。

zshで書いているが、hookがあるシェルならできる(hookの登録の仕方が違うと思うけど)

やりたいこと

しきい値が10秒の場合

ls #通知は来ない
heavy-command #10秒以上かかる場合は終了後slackに通知が来る

のように、実行に10秒以上時間がかかった場合だけ、Slackに終了通知を飛ばしてほしい

実現方法

Webhook URLを取得する

予めSlack:Webhook URL取得してSlackに通知するなどを参考にWebhook URLを取得。

.zshrc追記

ホームディレクトリにある.zshrcに以下を追記する。($WEBHOOK_URLは上記で取得したURLに書き換える)

alias snotice='curl -X POST --data-urlencode "payload={\"username\": \"webhookbot\", \"text\": \"Command finished:$CMD_NEWEST \", \"icon_emoji\": \":ghost:\"}" $WEBHOOK_URL'

function record_start_time(){
    export PREEXEC_TS=`date '+%s'`
    local LINE=${1%%$'\n'}
    export CMD_NEWEST=${LINE%% *}
}

function notify_to_slack(){
    THRESHOLD_TS=`date -d "10 second ago" '+%s'` #ここでしきい値を調整(この場合は10秒)
    if [ -z $PREEXEC_TS ]; then
        PREEXEC_TS=`date '+%s'`
    fi
    if [[ $PREEXEC_TS -lt $THRESHOLD_TS && $CMD_NEWEST != (vim|ssh|man) ]]; then #vim, ssh, manは対象外にする
        snotice
    fi
    PREEXEC_TS=
}
autoload -Uz add-zsh-hook
add-zsh-hook precmd notify_to_slack
add-zsh-hook preexec record_start_time

テスト

source .zshrc
sleep 3 #通知は来ない
sleep 13 #通知が来る
1
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?