実行に長時間かかるコマンドをよく実行する場合に便利。
研究で数時間かかるスクリプトを回しがちで、終了したら教えてほしかったので作った。
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 #通知が来る