私がするときに完全に実行される非常に単純なbashスクリプトがあります。
./removeOldBackup.sh
または
sh /home/myusername/backup/removeOldBackup.sh
しかし、crontabに追加すると
* * * * * sh /home/myusername/backup/removeOldBackup.sh
または
* * * * * /bin/sh /home/myusername/backup/removeOldBackup.sh
決して動作しません...
これは私のスクリプトです。
#!/bin/sh
find . -name 'files_20[1-3][0-9]-[0-9][0-9]-[1-2][1-9]--*' -delete
find . -name 'files_20[1-3][0-9]-[0-9][0-9]-0[2-9]--*' -delete
find . -name 'database_20[1-3][0-9]-[0-9][0-9]-[1-2][1-9]--*' -delete
find . -name 'database_20[1-3][0-9]-[0-9][0-9]-0[2-9]--*' -delete
私のスクリプト権限は次のとおりです。
-rwxr-xr-x 1 root root 295 Jul 25 10:07 /home/myusername/backup/removeOldBackup.sh
rootユーザー用のcrontabが追加されました。
これが私が見つけたものです/var/log/syslog
:
Jul 25 10:11:01 myservername /USR/SBIN/CRON[7583]: (root) CMD (sh /home/myusername/backup/removeOldBackup.sh)
したがって、スクリプトを手動で実行すると、バックアップファイルが正しく削除されます。 cronで実行すると削除されません。私はdebian-6.0-x86_64を使用しています。
答え1
誰かがコメントで言った内容を定式化して拡張するためにルートのcrontabに何かを入れると、スクリプトがあるディレクトリでは/root
なく内部的に実行されます。cron
場所もわからないからです。バックアップファイルがそのディレクトリツリーにないため、find
コマンドはそのファイルに到達しません。したがって、ジョブは実行中ですが、削除するファイルが見つかりません。絶対パスを指定するfind
か、最初に追加するとcd /home/myusername/backup
問題が解決します。
それにもかかわらず、このcronjobをrootとして実行する必要はまったくないようです。すべてのファイルはmyusername
のホームディレクトリにあり、おそらくそのファイルの所有者かもしれません。 cronjobをユーザーのcrontabに入れるのはどうですか?ルートバージョンで使用されているcrontab -e
のとmyusername
同じ行を実行して追加します。これにより、権限のあるユーザーでジョブを実行する必要がなくなり(ファイルも自動的に削除されます)、スクリプトが開始されたジョブの場所に配置されます。