非常に単純な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を使用しています。
コメントで誰かが言ったことを形式化して拡張するために、rootのcrontabに何かを置くと、スクリプトが置かれているディレクトリではなく、/root
内で実行されます。cron
も知らないからです。それはどこにありますか。バックアップファイルはそのディレクトリツリーにないため、find
コマンドがそれらに到達することはありません。したがって、ジョブは実行されており、削除するファイルが見つからないだけです。 find
への絶対パスを指定するか、最初にcd /home/myusername/backup
を追加すると、問題が解決します。
それでも、このcronジョブをrootとして実行する必要はまったくないようです。すべてのファイルはmyusername
のホームディレクトリ内にあり、おそらくそれらも所有しています。代わりに、cronジョブをそのユーザーのcrontab内に配置してみませんか? crontab -e
をmyusername
として実行し、rootのバージョンに使用したのとまったく同じ行を追加します。そうすれば、特権ユーザーとしてタスクを不必要に実行する必要がなくなり(ファイルを自動的に削除することもあります)、スクリプトを開始するための作業場所にもなります。