web-dev-qa-db-ja.com

/ bin / rm:無効なオプション-コマンドをcronjobとして実行する場合は「^ M」

私はファイルをクリーンアップするために毎時間このコマンドを実行しています:

# crontab -l
MAILTO=notify@localhost
0 */1 * * * find /var/www/tmp/ -name "*" -mmin +60 | /usr/bin/xargs /bin/rm -f -R

しかし、cronjobが実行されるたびに、このエラーメッセージを含む電子メールが私のメールアカウントに送信されます。

/bin/rm: invalid option -- '^M'

コマンドを手動で実行すると正常に動作します。

find /var/www/tmp/ -name "*" -mmin +60 | /usr/bin/xargs /bin/rm -f -R
# ok

ログは以下を示します:

grep CRON /var/log/syslog
Dec 23 06:34:01 Ubuntu-1804-bionic-64-minimal CRON[29314]: (root) CMD (find /var/www/tmp/ -name "*" -mmin +60 | /usr/bin/xargs /bin/rm -f -R --^M)

明らかに問題はcronファイルにあります。

よろしく、

4
Hyndrix

Crontabファイルの行の最後にキャリッジリターンがあるようです(^Mは、キャリッジリターンに適していないプログラムによって出力されることがあります)。これは次の方法で確認できます。

cat -v /var/spool/cron/crontabs/{user}

必ず{user}をユーザー名に置き換えてください。出力に^Mが表示される場合は、ファイルに改行があります。これらはsedのようなプログラムで削除できます。必ず最初にファイルをバックアップしてください):

sed -i 's/\r//' /var/spool/cron/crontabs/{user}'

MonicaによるLightness Racesからのコメント で述べたように、 dos2unix もテキストファイルから改行を削除するための優れたオプションです。

Dos2unixのデフォルトは、ファイルをその場で上書きするため、ファイルをバックアップした後

dos2unix /var/spool/cron/crontabs/{user}
15
thesmiley1

Sergiy Kolodyazhnyyのヒントのおかげで、すべてのcrontabが制御文字で終わっていることがわかりました。次に、コマンドを消去して再入力しましたが、次のように機能します。

crontab -l
crontab -e # enter commands here again
6
Hyndrix