我创建了一个脚本来备份我的数据库和网站。如果我直接运行它,它会运行良好,但它根本不像 cron 作业那样运行。
我创建了指向该脚本的符号链接:
lrwxrwxrwx 1 root root 44 Feb 11 14:58 backupsql -> /home/techguyalabama/dropboxbackup/backupsql
backupsites
如果我从目录运行/etc/cron.daily
,它会提示我输入密码。我不确定这是否是问题所在。如果是,我该如何避免这种情况?
我确实更改了 cron 作业的运行时间。也许这也是不行的?
这是在我的 crontab 中:
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
05 5 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
30 5 * * 6 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
00 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
我确实重新启动了服务器以查看是否有区别,但事实并非如此。
我还检查了系统日志,来自这篇文章cron / crontab 日志在哪里?,查看其中是否有关于 backupsql 的内容:
tail -f /var/log/syslog | grep backupsql
我没有得到任何结果。
有人看到我做错什么了吗?
编辑#1
这是我的备份sql脚本:
#!/bin/bash
DB_BACKUP="/home/techguyalabama/dropboxbackup/sqlbackup"
DB_USER="root"
DB_PASSWD="wouldntyouliketoknow"
HN=`hostname | awk -F. '{print $1}'`
# Create the backup directory
mkdir -p $DB_BACKUP
# Backup each database on the system
for db in $(mysql --user=$DB_USER --password=$DB_PASSWD -e 'show databases' -s --skip-column-names|grep -viE '(staging|performance_schema|information_schema)');
do mysqldump --user=$DB_USER --password=$DB_PASSWD --events --opt --single-transaction $db | gzip > "$DB_BACKUP/mysqldump-$HN-$db-$(date +%Y-%m-%d).gz";
done
/home/techguyalabama/dropboxbackup/dropbox_uploader.sh upload /home/techguyalabama/dropboxbackup/sqlbackup/*.* /sqlbackup/
rm -f /home/techguyalabama/dropboxbackup/sqlbackup/*.*
答案1
不要忘记这些 cron 脚本是以 root 身份运行的,这意味着例如主目录指的是 root 的主目录,等等。
由于您的脚本要求输入密码,您可能需要以 root 权限运行它,因此您不能只创建通常的 .anacron/cron.daily 并将脚本放入其中,您必须使用 /etc/cron.daily 以便它以正确的权限执行。
我认为最简单的解决方案是检查您的脚本是否使用用户特定的变量(如 $HOME),在这种情况下,您必须将其替换为用户“techguyalabama”的变量。
答案2
我刚刚关注了这个答案如何正确设置 root cron 任务:
如果您想以普通用户身份运行脚本:
crontab -e
并添加以下行:
07,37 * * * * /usr/bin/tunlrupdate.sh
如果你想以 root 身份运行脚本:
sudo crontab -e
并添加相同的行:
07,37 * * * * /usr/bin/tunlrupdate.sh
作为用户,它立即起作用。