find -deleteは問題なく動作しますが、cronでは動作しません


10

注意してください私は同様の質問をすべて読みました。cron、パス、環境変数などですが、私の特定の問題の解決策を提供するものは見つかりませんでした。


私はいくつかのMySQLダンプを作成し、次のように古いものを削除するスクリプトを持っています。

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete

上記のコマンドは、コメントからの提案により、元のコマンドから変更されています

ただし、cronがこのスクリプトを実行しても、ファイルが削除されることはありません。cronユーザーはrootです。

デバッグに関する注意

  • コマンドが表示されているスクリプトを手動で実行すると、期待どおりにスクリプトが削除されます。

  • rootとしてコマンドラインから上記のfindコマンドを単独で実行すると、期待どおりに削除されます(-printを使用すると、期待どおりに5日より古いファイルのリストが返されます)。

  • また、ルートのcrontabに明示的なパスステートメントを追加しましたが
    、何も変更されません。

  • Cronはエラーを送信しません。パイプを使って検索操作をログファイルに送信すると、ログファイルは
    空になるか、まったく作成されません。

  • Ubuntuサーバー14.04.03 LTSを使用しています。


パスでのワイルドカード展開(* .gzなど)は避けます。cronは* .gzとして解釈し、すべてのgzファイルを展開しない場合があります。
Archemar

あなたはアクションなしでジョブを実行する場合、あなたはどのような出力を得るのですか/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
user9517

@Archemarなぜワイルドカードが拡張されないのですか?cronコマンドはシェルを介して実行され、シェルはワイルドカードを展開します。
Barmar

cron出力とエラーメッセージを電子メールで送信する必要があります。この仕事からそのようなメールを受け取りますか?
Barmar

@イアンそれは期待どおりに動作します。
TommyPeanuts

回答:


6

問題は、実行時に設定されてcrontabいないこと$PATHです。次のようにして開いたファイルの先頭にこれを追加することで、実際にパスを指定できますcrontab -e

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

(またはPATH使用したいものは何でも)。つまり、cronから直接、コマンドへのフルパスを指定する必要がなくなります。

元のコマンドには複数の問題があります。シェルではなく、基本的にワイルドカード展開をシェルに要求していますfind。第二に、あなたはの完全なパスを提供していませんrm。システムのどこにでも、/bin/rmまたはを使用/usr/bin/rmします(を参照which rm)。

findの最初の引数は「検索する場所」-<option>です。次に、さまざまなで「検索クエリ」を指定します。したがって、実行するコマンドの適切な形式は次のとおりです。

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec rm -f {} \;

または

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete

PATH上記のような定義を指定しない場合は、次を使用します。

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec /bin/rm -f {} \;

または

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete

1
$PATH設定されているはずですが、システムのデフォルトになります。これは含まれています/usr/binし、/bin見つけることができる必要がありますので、rmコマンドを。
Barmar

そこで、私はcrontabに$ PATHを入れて(他の場所で述べられているように、特に明記しない場合はデフォルトでシステムパスに設定されます)、すべてがフルパスであることを確認しました。検索パスでは、ワイルドカードの代わりに-name "* .gz"も使用しました。しかし、何も起こりません。コマンドが実行されていないようで、エラーはスローされません。
TommyPeanuts、2015

3

代わりにこれを試してください

find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete

stderrをファイルにリダイレクトするのはなぜですか?出力があった場合、デフォルトではメールで送信されます。
kasperd

はい、デフォルトでユーザーのスプーラーMAILにメールを送信し、メールを使用して読み取ることができるのは事実です。
shad0VV

1
元のコマンドと同じ効果を得るには、を追加する必要があります-maxdepth 1
Niels Keurentjes

0

スクリプトの一部としてではなく、ルートのcrontabから直接findコマンドを呼び出すと、機能します。

問題のスクリプトはcshを使用しています。Ubuntuのrootのcron環境は/ bin / bash(または/ bin / dash?)を使用すると思います。おそらくこれは、何らかの方法でfindコマンドの実行方法と競合します。

どちらにせよ、やや上品ではありませんが、解決した主な問題。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.