web-dev-qa-db-ja.com

cronによって実行されていないbashスクリプト

非常に単純な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
borsuk

コメントで誰かが言ったことを形式化して拡張するために、rootのcrontabに何かを置くと、スクリプトが置かれているディレクトリではなく、/root内で実行されます。cronも知らないからです。それはどこにありますか。バックアップファイルはそのディレクトリツリーにないため、findコマンドがそれらに到達することはありません。したがって、ジョブは実行されており、削除するファイルが見つからないだけです。 findへの絶対パスを指定するか、最初にcd /home/myusername/backupを追加すると、問題が解決します。

それでも、このcronジョブをrootとして実行する必要はまったくないようです。すべてのファイルはmyusernameのホームディレクトリ内にあり、おそらくそれらも所有しています。代わりに、cronジョブをそのユーザーのcrontab内に配置してみませんか? crontab -emyusernameとして実行し、rootのバージョンに使用したのとまったく同じ行を追加します。そうすれば、特権ユーザーとしてタスクを不必要に実行する必要がなくなり(ファイルを自動的に削除することもあります)、スクリプトを開始するための作業場所にもなります。

1
Michael Homer