我有一个非常简单的 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
为了形式化和扩展某人在评论中所说的内容,当您将某些内容放入 root 的 crontab 中时,它将在内部运行/root
,而不是在脚本所在的目录中运行,因为cron
甚至不知道它在哪里。由于您的备份文件不在该目录树中,因此该find
命令永远不会到达它们。所以作业正在运行,它只是找不到任何要删除的文件。提供绝对路径find
或首先添加cd /home/myusername/backup
将解决您的问题。
尽管如此,似乎根本不需要以 root 身份运行这个 cronjob:所有文件都在myusername
的主目录中,并且可能也归他们所有。为什么不把你的 cronjob 放在该用户的 crontab 中呢?运行crontab -e
为myusername
并添加与 root 版本使用的完全相同的行。这样,您就不必以特权用户身份运行任务(同样会自动删除文件),并且您也将位于脚本启动的工作位置。