はじめに
掲題の通り、ログをファイルに出力するshellを作成しました。
また、定期実行するためにcronにも登録してみました。
shell
#!/bin/bash
LOG_OUT=./stdout.log
LOG_ERR=./stderr.log
exec 1> >(tee -a $LOG_OUT)
exec 2> >(tee -a $LOG_ERR)
# 標準出力
echo foo1
echo foo2
echo foo3
# 標準エラー出力
ls /foo
rm /foo
簡単に説明していきます。
「echo」:コンソールに出力します。
「ls /foo」:fooのディレクトリに移動。※今回はエラーにするために、わざとディレクトリを作成しません。
「rm /foo」:fooのディレクトリを削除。※今回はエラーにするために、わざとディレクトリを作成しません。
「LOG_OUT=./stdout.log」:変数にファイルの場所を格納しています。
「LOG_ERR=./stderr.log」:変数にファイルの場所を格納しています。
「exec 1> >(tee -a $LOG_OUT)」:shellを実行時に標準出力をコンソールとファイルの両方に出力します。
「exec 2> >(tee -a $LOG_ERR)」:shellを実行時に標準エラーをコンソールとファイルの両方に出力します。
crontab
①「chmod 755 test.sh」で実行権限をshellに付与します。
②「crontab -e」でcronを登録するためにファイルを開きます。
③「*/1**** cd /home && ./test.sh
」を入力して「:wq」で保存します。
※1分間隔でshellを実行します。cdで移動していますが、各々のパスに合わせてください。
補足
shが実行されるたびに、cronからメールがくる場合があります。
もし、メールを停止させたい場合は以下の対応を行ってください。
①メールを消すshellを作成する。
#!/bin/bash
cat /dev/null > /var/spool/mail/root
sleep 2
cat /dev/null > /var/spool/mail/root
sleep 2
cat /dev/null > /var/spool/mail/root
sleep 2
cat /dev/null > /var/spool/mail/root
sleep 2
cat /dev/null > /var/spool/mail/root
sleep 2
cat /dev/null > /var/spool/mail/root
②作成したshellをcrontabに登録する。
┗「chmod 755 deletemail.sh」
┗「crontab -e」
┗「*/1**** cd /home && ./deletemail.sh
」
※deletemail.shの説明ですが、メールのファイルの内容を2秒間隔でクリアしています。(計6回)
sleepは指定した時間分、処理を止めてくれます。
これをcrontabに登録することでメールは飛びますが、即座に消してくれるので、
メールの通知がコンソール上に表示されなくなります。