![cronjob コマンドを使用してログ ファイルにタイムスタンプを追加する](https://rvso.com/image/36009/cronjob%20%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%AD%E3%82%B0%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%20.png)
5 分ごとにファイルに出力メッセージをログに記録しながら git pull コマンドを実行しようとします。
しかし、このようなエラーが発生しました。
(root) CMD (cd /var/www/sites/ && git pull origin master | sed -e "s/^/$(date +\")
(CRON) error (grandchild #1111 failed with exit status 2)
私のcronjobコマンドは次のとおりです。
*/5 * * * * cd /var/www/site/ && git pull origin master | sed -e "s/^/$(date +\"%d-%m-%y\ %T\"), /" >> /var/log/crond/site.log
どうすれば修正できますか?
答え1
注意:一部のシステムでは、%
crontabではaが特別な意味を持ちます。私のシステムのcrontab(5)より
「6 番目」のフィールド (行の残り) は、実行するコマンドを指定します。行のコマンド部分全体 (改行または「%」文字まで) は、/bin/sh または cronfile の SHELL 変数で指定されたシェルによって実行されます。 コマンド内の「%」文字は、バックスラッシュ (\) でエスケープしない限り、改行文字に変更され、最初の % の後のすべてのデータは標準入力としてコマンドに送信されます。
私強く日付形式の使用をお勧めします%Y-%m-%d
。標準、これは語彙順と時系列順に同じようにソートされます。一部の strftime 実装には、これを省略した表現があります。%F
システムにts
指示
cd /dir && git pull origin master 2>&1 | ts "\%F \%T" >> /var/log/crond/site.log
「リアルタイム」のタイムスタンプを取得するには、コマンドをバッファリング解除する必要があるかもしれません: (本当に醜くなってきました)
cd /dir && stdbuf -oL sh -c 'git pull origin master 2>&1' | ts "\%F \%T" >> /var/log/crond/site.log