我(显然)不确定,但我想我的问题是cron配置.也许是冲突因为脚本在午夜多次运行?我不确定这是否可能,但如果是这样,我会感谢有关微调我的crontab的说明.
我的crontab:
- # * * * * * user-name command to be executed
- 00 * * * * /data/backup.sh -h #hourly
- 00 00 * * * /data/backup.sh -d #daily
- 00 00 * * 6 /data/backup.sh -w #weekly
- 00 00 1 * * /data/backup.sh -m #monthly
编辑:我更新了我的crontab以交错分钟,但它仍然无效:
- # * * * * * user-name command to be executed
- 00 * * * * /data/backup.sh -h #hourly
- 05 00 * * * /data/backup.sh -d #daily
- 10 00 * * 6 /data/backup.sh -w #weekly
- 15 00 1 * * /data/backup.sh -m #monthly
我通过这个命令访问这些:
- sudo crontab -u my_user_group_name -e
linux版本:
- $cat /proc/version
- Linux version 3.10.0-514.6.1.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Wed Jan 18 13:06:36 UTC 2017
当作为手动shell脚本运行时,备份脚本可以自行运行,并带有任何标志(-h,-d,-w,-m).它工作没有失败.它是一个wordpress备份脚本,使用wp-cli,它基本上序列化了MariaDB数据库.为了完整起见,我在本问题的最后加入了脚本.
我已经仔细检查了一般cron troubleshooting advice from this answer,但我认为没有任何适用于我的问题:
>我认为问题不在于备份脚本本身,因为问题只发生在cron运行期间,而不是直接在shell中运行.很高兴有人证明我错了.
>我认为问题不在于更广泛的环境,而在于与cron配置本身有关(上图),因为问题仅在某些cron运行期间发生,但其他人执行成功.例如,Crontab没有错误名称,它具有正确的权限等.
> cron的回答没有说明cron运行的频率,运行之间的冲突,或者我认为可能在问题背后的其他动态.
以下是有问题的备份目录的权限(在/ data / backup /中.如您所见,每小时和每周目录具有相同的权限.
- drwxr-xr-x. 2 libsys libsys 4096 Feb 20 00:05 daily
- drwxrwxr-x. 2 root backup 4096 Feb 20 10:00 hourly
- -rw-rw-r--. 1 root backup 35644 Feb 20 10:00 log.txt
- drwxrwxr-x. 2 root backup 4096 Feb 13 11:23 manual
- drwxrwxr-x. 2 aberry3 aberry3 4096 Feb 6 10:36 monthly
- drwxrwxr-x. 2 aberry3 aberry3 4096 Feb 6 10:36 weekly
我只是注意到每日权限没有组写;我会解决这个问题,并在一周内回来查看.然而,这可能是一个红鲱鱼;我的问题不在于每日备份,它可以正常工作:只有每周和每月备份不会发生.
这是备份脚本:
- #!/bin/bash
- # Usage
- # This script will make a backup of the wordpress database,into the
- # defined backup directory,"/data/backups".
- # Options are -hdwm,for "hourly","daily","weekly","monthly"; these
- # simply put the backups into different subdirectories. Running the script
- # without options creates four backups,one in each directory.
- # The script also "cleans up" the directories afterward.
- # constants
- WP_DIR=/var/www/wordpress/docroot
- DATA_DIR=/data/backups
- LOG=$DATA_DIR/log.txt
- # vars
- TIMESTAMP=$(date +%Y-%m-%d.%H-%M-%S)
- # run all commands from WP root directory
- cd $WP_DIR
- # the meat of the backup script
- backup () { # arguments: "hourly","monthly","manual"
- INTERVAL=$1
- BACKUP_DIR=$DATA_DIR/$INTERVAL
- # create directory hierarchy if not exists
- mkdir -p $BACKUP_DIR
- # create backup
- FILENAME=$(printf "%s/wp-mariadb-%s.sql" "$BACKUP_DIR" "$TIMESTAMP")
- /usr/local/bin/wp db export $FILENAME
- # make sure backup happened
- if [ -s $FILENAME ]
- then
- echo "√ backup OK $TIMESTAMP $INTERVAL" >> $LOG
- else
- echo "!!! backup FAIL $TIMESTAMP $INTERVAL" >> $LOG
- exit 1 # terminate and indicate error
- fi
- # clean up backup directory
- BACKUP_FILES=$BACKUP_DIR/*.sql
- case $INTERVAL in
- "hourly")
- KEEP=24
- ;;
- "daily")
- KEEP=7
- ;;
- "weekly")
- KEEP=4
- ;;
- "monthly")
- KEEP=12
- ;;
- "manual")
- KEEP=999 # don't automatically delete manual backups
- ;;
- esac
- # evaluate which files to delete from directory
- for BACKUP in $BACKUP_FILES; do
- # if (BACKUP_FILES quantity > KEEP)
- # and if (BACKUP age in minutes) > (minutes ago)
- # delete backup
- ARR=($BACKUP_FILES) # convert to array
- LEN=${#ARR[@]} # length of array
- # if we have too many backups...
- if (($LEN > $KEEP)); then
- # ...delete the backup.
- rm $BACKUP
- fi
- done
- }
- # run particular backup scripts depending on options
- while getopts "hdwma" arg; do
- case $arg in
- h)
- backup "hourly"
- ;;
- d)
- backup "daily"
- ;;
- w)
- backup "weekly"
- ;;
- m)
- backup "monthly"
- ;;
- a)
- # a stands for all; backup everywhere
- backup "hourly"
- backup "daily"
- backup "monthly"
- ;;
- *)
- echo "Error: command not recognized"
- echo "!!! backup FAIL $TIMESTAMP illegal option in '$1'" >> $LOG
- ;;
- esac
- done
- ...
- √ backup OK 2017-02-17.22-00-01 hourly
- √ backup OK 2017-02-17.23-00-01 hourly
- √ backup OK 2017-02-18.00-00-02 hourly
- √ backup OK 2017-02-18.00-05-01 daily
- !!! backup FAIL 2017-02-18.00-10-02 weekly
- √ backup OK 2017-02-18.01-00-01 hourly
- √ backup OK 2017-02-18.02-00-02 hourly
- √ backup OK 2017-02-18.03-00-02 hourly
- √ backup OK 2017-02-18.04-00-02 hourly
- √ backup OK 2017-02-18.05-00-01 hourly
- √ backup OK 2017-02-18.06-00-01 hourly
- √ backup OK 2017-02-18.07-00-01 hourly
- √ backup OK 2017-02-18.08-00-02 hourly
- √ backup OK 2017-02-18.09-00-02 hourly
- √ backup OK 2017-02-18.10-00-01 hourly
- √ backup OK 2017-02-18.11-00-04 hourly
- √ backup OK 2017-02-18.12-00-03 hourly
- √ backup OK 2017-02-18.13-00-02 hourly
- √ backup OK 2017-02-18.14-00-02 hourly
- √ backup OK 2017-02-18.15-00-01 hourly
- √ backup OK 2017-02-18.16-00-02 hourly
- √ backup OK 2017-02-18.17-00-04 hourly
- √ backup OK 2017-02-18.18-00-02 hourly
- √ backup OK 2017-02-18.19-00-02 hourly
- √ backup OK 2017-02-18.20-00-02 hourly
- √ backup OK 2017-02-18.21-00-02 hourly
- √ backup OK 2017-02-18.22-00-03 hourly
- √ backup OK 2017-02-18.23-00-02 hourly
- √ backup OK 2017-02-19.00-00-03 hourly
- √ backup OK 2017-02-19.00-05-02 daily
- √ backup OK 2017-02-19.01-00-03 hourly
- √ backup OK 2017-02-19.02-00-02 hourly
- √ backup OK 2017-02-19.03-00-01 hourly
- ...
- sudo crontab -u my_user_group_name -e
结合备份目录的各种用户和组所有权:
- drwxr-xr-x. 2 libsys libsys 4096 Feb 20 00:05 daily
- drwxrwxr-x. 2 root backup 4096 Feb 20 10:00 hourly
- -rw-rw-r--. 1 root backup 35644 Feb 20 10:00 log.txt
- drwxrwxr-x. 2 root backup 4096 Feb 13 11:23 manual
- drwxrwxr-x. 2 aberry3 aberry3 4096 Feb 6 10:36 monthly
- drwxrwxr-x. 2 aberry3 aberry3 4096 Feb 6 10:36 weekly
看起来很腥.我猜测实际用户 – 假设你真的没有名为my_user_group_name的用户 – 不是aberry3.如果我采取疯狂猜测,我会说libsys正在运行脚本谁是备份的成员,但不是aberry3组的成员.