- PR -

findを用いたファイル削除がcronで実行できない

投稿者投稿内容
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2007-09-01 13:59
vixie-cronには変な仕様とかバグとかも結構あるですからねえ。
octpusyo
常連さん
会議室デビュー日: 2007/08/29
投稿数: 20
投稿日時: 2007-09-04 18:41
みなさんありがとうございます。

cronは…、動いています。
省略しましたが、cronには他にも設定してあります。
cronでバックアップサーバのバックアップファイルを作成しています。
その設定は問題なく動いています。

とりあえず 「-exec rm {}」を「-exec rm -rf {}」にして
様子を見てみます。

ちなみにfindでの削除対象ファイルサイズが3G近いことは
関係ないですよね・・・?

angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2007-09-04 19:45
こんばんは。

登録したジョブが実行されるかどうかが焦点なので、コマンドの中身よりも、ジョブの登録・実行確認をもう少し突き詰める方が優先だと思います。

一つありがちな話としては、crontabファイルの最後にジョブを追加したつもりで、そのジョブの行 ( ファイルの最終行 ) に改行がないと、そのジョブが認識されない、というのもありませんでしたっけ。
octpusyo
常連さん
会議室デビュー日: 2007/08/29
投稿数: 20
投稿日時: 2007-09-12 13:30
お世話になってます。

あまりうれしくないことが分かりました。

[root@bkpsv root]# crontab -l
#0 6 * * * find /data01/A -name \*.tar.gz -atime +4 -exec rm {} \;
0 6 * * * find /data01/A -name \*.tar.bz2 -atime +3 -exec rm {} \;
0 0 * * 1 /backup/script/sql_php_bak.sh
0 1 * * 1 find /backup/data/ -name \*.tar.gz -mtime +29 -exec rm {} \;
#0 6 * * * find /data01/C -name \*.tar.gz -atime +8 -exec rm {} \;
0 7 * * * find /data01/C -name \*.tar.bz2 -atime +7 -exec rm {} \;

今回問題があるのは二行目です。
しかしほぼ同じ設定の最後の行のジョブは、問題なく稼動しています。
Cサーバからも、冒頭に上げたものとほぼ同じシェルで、
Bサーバにバックアップしています。

バックアップファイルの作成方法と転送方法が同じで、
サーバ上の保存先ディレクトリが異なるだけなのに、
ほぼ同じcronのジョブが動かないとはこれまたどういうことでしょうか???

どうかよろしくお願いします。


[ メッセージ編集済み 編集者: octpusyo 編集日時 2007-09-12 13:31 ]
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2007-09-12 16:07
問題の切り分けをするために、以下のように登録して、正しくcronが実行されているか
確認してはいかがでしょう?
コード:
0 6 * * * logger "job-0001 start"; find /data01/A -name \*.tar.bz2 -atime +3 -exec rm {} \; && logger "job-0001 success" || logger "job-0001 fail"
0 0 * * 1 logger "job-0002 start"; /backup/script/sql_php_bak.sh && logger "job-0002 success" || logger "job-0002 fail"
0 1 * * 1 logger "job-0003 start"; find /backup/data/ -name \*.tar.gz -mtime +29 -exec rm {} \; && logger "job-0003 success" || logger "job-0003 fail"
0 7 * * * logger "job-0004 start"; find /data01/C -name \*.tar.bz2 -atime +7 -exec rm {} \; && logger "job-0004 success" || logger "job-0004 fail"


・シスログに正しく start -> success が出力されているなら、find コマンドの実行実績と
 戻り値に整合性がとれてないことがわかります。
・シスログに start しか出力されていないなら、find -> rm の過程でコケているわけです。
・シスログに start すら出力されないなら cron のバグを疑うことができますよね?

octpusyo
常連さん
会議室デビュー日: 2007/08/29
投稿数: 20
投稿日時: 2007-09-12 16:42
温州蜜柑さんありがとうございます。

そんな方法があるとは知りませんでした。
ただ…検証機が無いので、すぐには試せそうもありません。
さすがにいきなり本番機で試すわけにもいきませんので…。

でも勉強になりました! ありがとうございます。
こちらもまた時間があるときに試すしかなさそうです。

octpusyo
常連さん
会議室デビュー日: 2007/08/29
投稿数: 20
投稿日時: 2007-09-14 09:31
未記入さんのcronログ調べました。
きちんと稼動ログが残ってました。

温州蜜柑さん案には、「検証機で…」と申し上げましたが、
Java僧案のシェル化をこっそりやってみました。

うまくいきました!
シェルで動かすと、きちんと意図したとおりに期限切れファイルが削除されます。
とりあえずこれで様子を見るとして…

原因はどう追究していけばいいのでしょうか。
もはや解決といえば解決なんですが、後学のため、
できれば根本的な原因を突き止めたいと思っています。

どうかまだまだ、よろしくお願いします。

スキルアップ/キャリアアップ(JOB@IT)