シェルスクリプトの結果をメールに送ってみる
この記事は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!