cron ジョブは出力をファイルにリダイレクトしません。 [重複]

cron ジョブは出力をファイルにリダイレクトしません。 [重複]

cronジョブで次の行を設定しました。/etc/cron.d/find_old_file

* * * * * root  [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n' >> /var/log/find_old_file

このクローンは10日前のログを見つける必要があります(ただし、/var/log/ambari-metrics-collectorフォルダが存在する場合のみ)。

不明確な理由で /var/log/find_old_file

テストしたとき、この行はシェルの bash ではうまく機能しましたが、cron では機能しませんでした。

私達はまた加えます2>&1ファイルの末尾にあるが機能しない

私のクローンの仕事に何が問題なのか教えてください。

more /etc/cron.d/find_old_file

* * * * * root  [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n'   >>    /var/log/find_old_file 2>&1

たとえば、シェル bash でテストする場合

 [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n'
2018 Aug 13 12:54 collector-gc.log-201808130951
2018 Aug 13 04:22 collector-gc.log-201808130403
2018 Aug 01 12:40 gc.log-201808011229
2018 Aug 01 12:40 collector-gc.log-201808011229
2018 Aug 09 15:36 gc.log-201808091332
2018 Aug 09 10:50 gc.log-201808090825
2018 Aug 13 04:02 collector-gc.log-201808130346
2018 Aug 13 16:51 gc.log-201808131358
2018 Aug 01 13:35 gc.log-201808011241
2018 Aug 01 13:35 collector-gc.log-201808011241
2018 Aug 09 15:39 collector-gc.log-201808091332
2018 Aug 02 23:06 gc.log-201808022256

私がこれを入れたとき

* * * * * root echo test  >> /var/log/test

それはうまくいきますが、私が説明したパスではありません

では、ここで何が起こっているのでしょうか?

答え1

%crontabのフラグ男 (5) crontab リファレンス特別な意味(改行文字)がある場合、コマンドが正しく機能するためには、その文字をエスケープする必要があります。

A "%" character in the
   command, unless escaped with a backslash (\), will be changed into
   newline characters, and all data after the first % will be sent to
   the command as standard input.

したがって、コマンドは次のようにする必要があります。

* * * * * root  [[ -d /var/log/ambari-metrics-collector ]] && find /var/log/ambari-metrics-collector -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '\%TY \%Tb \%Td \%TH:\%TM \%P\n' >> /var/log/find_old_file

答え2

実行可能なシェルファイルの生成

cat /root/bin/find_old_file
    #!/bin/sh
    [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n' >> /var/log/find_old_file

cronを介して実行します。

cat /etc/cron.d/find_old_file
    * * * * * root  /root/bin/find_old_file

cronに合わせてスクリプトの形式を再指定する必要がある場合は、cronからスクリプトを移動するのが便利なことがよくあります。

関連情報