![cron ジョブでは拡張ログ記録が利用できますか?](https://rvso.com/image/52111/cron%20%E3%82%B8%E3%83%A7%E3%83%96%E3%81%A7%E3%81%AF%E6%8B%A1%E5%BC%B5%E3%83%AD%E3%82%B0%E8%A8%98%E9%8C%B2%E3%81%8C%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
の下に 3 つのスクリプトがあります/etc/cron.daily
。cron ログは に書き込まれます/var/log/cron
。以下は、実行された上記の cron のエントリです。
(root) CMD (run-parts /etc/cron.hourly)
ここで、cron 内のスクリプトのstdout
orは利用できません。これは、コマンドがこのフォルダーで実行されたことを示しています。stderr
run-parts
3 つのスクリプトの実行中に何が起こったかをログに記録するのに役立つトリックはありますか?
注意: スクリプトを編集して、cron.daily
出力とエラーをログ ファイルにリダイレクトすることはできません。
答え1
Unix では、メール システムはシステム通知をユーザーに配信する手段です。これは、通知が必要な場合にタスク バーにポップアップ メッセージが表示される Windows のようなものだと考えることができます。cronjobs は (理論上) 出力を生成しないはずなので (誰もそれを見ることはないはずなので)、出力 (stdout または stderr) はすべてエラーまたは問題の可能性を示すものとして扱われ、cronjob の所有者に確認を促すメールが送信されます。
したがって、すべての出力 (stdout と stderr) は、ローカル メール システムを通じて cronjob の所有者に送信されます。所有者が個人アカウントでない場合は、エイリアスを設定することで、ローカル MTA に実際のメール アカウントにリレーするように指示できます。たとえば、次のコードを追加しました/etc/aliases
。
root: [email protected]
次に、newaliases
コマンドを実行しました (メール エイリアス データベースを再構築するため)。その後、会社のメール受信トレイに root のメールが届くようになりました。
root@xxxxxxvlp05 ~ $ echo "the game" | mutt root -s "No Diggity"
sendmail: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
sendmail: warning: inet_protocols: configuring for IPv4 support only
postdrop: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
postdrop: warning: inet_protocols: configuring for IPv4 support only
これがほぼ通常の方法です (システムに通知メールを送信させる)。通知を処理する方法は他にもあります。いくつかの代替案:
エイリアスを変更して電子メールを特定のファイルに保存します。
root: /var/log/rootMails
メールをスクリプトにパイプする:
root: |/usr/local/bin/filterMail
エイリアスをいじる代わりに、多くの cron デーモンがサポートするユーザーの crontab 内のオプションを使用することもできます。これは、ユーザーの特定の通知セットのみを受信し、メールボックスにドロップされるもの (これが目的です)MAILTO=
は受信したくない場合に便利です。aliases
他にもたくさんあると思いますが、おそらく最初か最後のものを実行することになるでしょう。
答え2
メールを送信する代わりに syslog を使用するオプションを指定して cron を実行できます-s
。これは少なくとも RHEL とその派生、FreeBSD、および MacOS で動作します。
答え3
bash スクリプト内で自分でログ記録を行うことができます:
logfile=/var/log/mine/whatever.log
log () {
timestamp=$(date +'%F %T')
echo -e "$timestamp $1" >> $logfile
shift
for a; do
echo -ne "$a" >> $logfile
done
}
log "Hello world.\nAnd so on..."
[...]
出力をログに記録したいコマンドを実行している場合:
somecommand 2>&1 >> $logfile
メッセージやエラーをシステム ロガー (を参照man logger
) に送信し、syslog 構成を介してそれらを並べ替えることもできます。