cronjob コマンドを使用してログ ファイルにタイムスタンプを追加する

cronjob コマンドを使用してログ ファイルにタイムスタンプを追加する

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

関連情報