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

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

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

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

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

[shell]

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

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

[/shell]

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

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

[shell]

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

[/shell]

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

[shell]

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

[/shell]

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

[shell]

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;
}

[/shell]

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

[shell]

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

[/shell]

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

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

[shell]
#!/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;
[/shell]

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

Hello!

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

SUCCESS!