シェルスクリプトの結果をメールに送ってみる

この記事はWanoグループ Advent Calendar 2016の8日目の記事です。

例えば、リリース用のコマンドなど、自作のシェルスクリプトを作ったとします。

その際に、実行中に出力された内容を他のみんなに共有したいなーと思ったとします。Slackに送るのにも使えますよ(うちは、特定のメールアドレスに送ったら、特定のチャンネルに届くようにしています)。まず、出力された内容をログファイルに書き込みましょう。


logfile=/path/to/log/$(date +%Y-%m-%d_%T).log

exec 1> >(tee $LOG_FILE)
exec 2>&1

こうるすることで、出力内容は、すべて /path/to/log/日付_時間.log 書き込まれます。

コマンドの引数や誰が実行したかを変数に入れておきます。


your_name=$(who am i | awk '{print $1}');
mailto="$your_name@example.com"
command_args="$@";

コマンドの実行中にプロンプトが出る場合は、それに対する応答も出力するようにしておきましょう。


echo -n "run? (y/n): "
read -p "" confirm;
echo "(select $confirm)" # ログに残すために echo しておく

次に _exit を定義して、exit を _exit に置換します。


function _exit () {
    n=$1;
    mark=""
    cat $log_file | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" \
      | mail -s "[COMMAND_NAME] $command_args - $your_name" $mailto;
 }

途中でエラーが起きたり、Ctrl-Cで中断してもメールを送るようにしましょう。


set -o errexit
trap "echo;echo;echo 'COMMAND IS ABORTED!!';_exit 1" 1 2 3 15

既存のスクリプトに、これくらい追加することで、自作のスクリプトの実行結果をメールで送るようにできます。

最後に、サンプルのスクリプトを置いておきます。

#!/bin/bash

mailto='to@example.com';
log_file="/tmp/log.$(date +%Y-%m-%d).log";

exec 1> >(tee $log_file);
exec 2>&1;
 
set -o errexit
trap "echo; echo; echo 'COMMAND IS ABORTED!!'; _exit 1" 1 2 3 15;
 

your_name=$(who am i | awk '{print $1}');
command_args="$@";
is_success=1;
 
function main () {
    echo -e '\e[1;32mHello!\e[0m\n';
    echo "input 'OK' with enter.";
    read -p "" input;
    echo "(input: $input)";

    if [ "$input" = "OK" ]; then
        is_success=0;
        echo;
        echo "SUCCESS!";
    fi
    _exit $is_success;
}
 
function _exit () {
    n=$1;
    mark=""
    result="NG";
    if [ "$n" = "0" ]; then
        result="OK";
    fi
    trap "exit" 1 2 3 15;
    sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" $log_file \
      | mail -s "[COMMAND_NAME] $command_args - $result - $your_name $result" \
      $mailto;
}
main;

実行すると、以下のようなメールが届きます。

Hello!

input ‘OK’ with enter.
(input: OK)

SUCCESS!

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です