centos – 为什么备份脚本会因cron而失败?

前端之家收集整理的这篇文章主要介绍了centos – 为什么备份脚本会因cron而失败?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我正在做数据库自动备份.备份脚本在我手动运行时以及Cron运行计划的每小时和每日备份时都能正常运行.但是,备份在每周和每月备份上失败.

我(显然)不确定,但我想我的问题是cron配置.也许是冲突因为脚本在午夜多次运行?我不确定这是否可能,但如果是这样,我会感谢有关微调我的crontab的说明.

我的crontab:

  1. # * * * * * user-name command to be executed
  2. 00 * * * * /data/backup.sh -h #hourly
  3. 00 00 * * * /data/backup.sh -d #daily
  4. 00 00 * * 6 /data/backup.sh -w #weekly
  5. 00 00 1 * * /data/backup.sh -m #monthly

编辑:我更新了我的crontab以交错分钟,但它仍然无效:

  1. # * * * * * user-name command to be executed
  2. 00 * * * * /data/backup.sh -h #hourly
  3. 05 00 * * * /data/backup.sh -d #daily
  4. 10 00 * * 6 /data/backup.sh -w #weekly
  5. 15 00 1 * * /data/backup.sh -m #monthly

我通过这个命令访问这些:

  1. sudo crontab -u my_user_group_name -e

linux版本:

  1. $cat /proc/version
  2. 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 /中.如您所见,每小时和每周目录具有相同的权限.

  1. drwxr-xr-x. 2 libsys libsys 4096 Feb 20 00:05 daily
  2. drwxrwxr-x. 2 root backup 4096 Feb 20 10:00 hourly
  3. -rw-rw-r--. 1 root backup 35644 Feb 20 10:00 log.txt
  4. drwxrwxr-x. 2 root backup 4096 Feb 13 11:23 manual
  5. drwxrwxr-x. 2 aberry3 aberry3 4096 Feb 6 10:36 monthly
  6. drwxrwxr-x. 2 aberry3 aberry3 4096 Feb 6 10:36 weekly

我只是注意到每日权限没有组写;我会解决这个问题,并在一周内回来查看.然而,这可能是一个红鲱鱼;我的问题不在于每日备份,它可以正常工作:只有每周和每月备份不会发生.

这是备份脚本:

  1. #!/bin/bash
  2.  
  3. # Usage
  4. # This script will make a backup of the wordpress database,into the
  5. # defined backup directory,"/data/backups".
  6. # Options are -hdwm,for "hourly","daily","weekly","monthly"; these
  7. # simply put the backups into different subdirectories. Running the script
  8. # without options creates four backups,one in each directory.
  9. # The script also "cleans up" the directories afterward.
  10.  
  11. # constants
  12. WP_DIR=/var/www/wordpress/docroot
  13. DATA_DIR=/data/backups
  14. LOG=$DATA_DIR/log.txt
  15.  
  16. # vars
  17. TIMESTAMP=$(date +%Y-%m-%d.%H-%M-%S)
  18.  
  19. # run all commands from WP root directory
  20. cd $WP_DIR
  21.  
  22. # the meat of the backup script
  23. backup () { # arguments: "hourly","monthly","manual"
  24. INTERVAL=$1
  25. BACKUP_DIR=$DATA_DIR/$INTERVAL
  26.  
  27. # create directory hierarchy if not exists
  28. mkdir -p $BACKUP_DIR
  29.  
  30. # create backup
  31. FILENAME=$(printf "%s/wp-mariadb-%s.sql" "$BACKUP_DIR" "$TIMESTAMP")
  32. /usr/local/bin/wp db export $FILENAME
  33.  
  34. # make sure backup happened
  35. if [ -s $FILENAME ]
  36. then
  37. echo "√ backup OK $TIMESTAMP $INTERVAL" >> $LOG
  38. else
  39. echo "!!! backup FAIL $TIMESTAMP $INTERVAL" >> $LOG
  40. exit 1 # terminate and indicate error
  41. fi
  42.  
  43. # clean up backup directory
  44. BACKUP_FILES=$BACKUP_DIR/*.sql
  45. case $INTERVAL in
  46. "hourly")
  47. KEEP=24
  48. ;;
  49. "daily")
  50. KEEP=7
  51. ;;
  52. "weekly")
  53. KEEP=4
  54. ;;
  55. "monthly")
  56. KEEP=12
  57. ;;
  58. "manual")
  59. KEEP=999 # don't automatically delete manual backups
  60. ;;
  61. esac
  62.  
  63. # evaluate which files to delete from directory
  64. for BACKUP in $BACKUP_FILES; do
  65. # if (BACKUP_FILES quantity > KEEP)
  66. # and if (BACKUP age in minutes) > (minutes ago)
  67. # delete backup
  68. ARR=($BACKUP_FILES) # convert to array
  69. LEN=${#ARR[@]} # length of array
  70.  
  71. # if we have too many backups...
  72. if (($LEN > $KEEP)); then
  73. # ...delete the backup.
  74. rm $BACKUP
  75. fi
  76. done
  77. }
  78.  
  79. # run particular backup scripts depending on options
  80. while getopts "hdwma" arg; do
  81. case $arg in
  82. h)
  83. backup "hourly"
  84. ;;
  85. d)
  86. backup "daily"
  87. ;;
  88. w)
  89. backup "weekly"
  90. ;;
  91. m)
  92. backup "monthly"
  93. ;;
  94. a)
  95. # a stands for all; backup everywhere
  96. backup "hourly"
  97. backup "daily"
  98. backup "monthly"
  99. ;;
  100. *)
  101. echo "Error: command not recognized"
  102. echo "!!! backup FAIL $TIMESTAMP illegal option in '$1'" >> $LOG
  103. ;;
  104. esac
  105. done

这是我的日志文件的示例,只是显示问题:

  1. ...
  2. backup OK 2017-02-17.22-00-01 hourly
  3. backup OK 2017-02-17.23-00-01 hourly
  4. backup OK 2017-02-18.00-00-02 hourly
  5. backup OK 2017-02-18.00-05-01 daily
  6. !!! backup FAIL 2017-02-18.00-10-02 weekly
  7. backup OK 2017-02-18.01-00-01 hourly
  8. backup OK 2017-02-18.02-00-02 hourly
  9. backup OK 2017-02-18.03-00-02 hourly
  10. backup OK 2017-02-18.04-00-02 hourly
  11. backup OK 2017-02-18.05-00-01 hourly
  12. backup OK 2017-02-18.06-00-01 hourly
  13. backup OK 2017-02-18.07-00-01 hourly
  14. backup OK 2017-02-18.08-00-02 hourly
  15. backup OK 2017-02-18.09-00-02 hourly
  16. backup OK 2017-02-18.10-00-01 hourly
  17. backup OK 2017-02-18.11-00-04 hourly
  18. backup OK 2017-02-18.12-00-03 hourly
  19. backup OK 2017-02-18.13-00-02 hourly
  20. backup OK 2017-02-18.14-00-02 hourly
  21. backup OK 2017-02-18.15-00-01 hourly
  22. backup OK 2017-02-18.16-00-02 hourly
  23. backup OK 2017-02-18.17-00-04 hourly
  24. backup OK 2017-02-18.18-00-02 hourly
  25. backup OK 2017-02-18.19-00-02 hourly
  26. backup OK 2017-02-18.20-00-02 hourly
  27. backup OK 2017-02-18.21-00-02 hourly
  28. backup OK 2017-02-18.22-00-03 hourly
  29. backup OK 2017-02-18.23-00-02 hourly
  30. backup OK 2017-02-19.00-00-03 hourly
  31. backup OK 2017-02-19.00-05-02 daily
  32. backup OK 2017-02-19.01-00-03 hourly
  33. backup OK 2017-02-19.02-00-02 hourly
  34. backup OK 2017-02-19.03-00-01 hourly
  35. ...
这个命令:
  1. sudo crontab -u my_user_group_name -e

结合备份目录的各种用户和组所有权:

  1. drwxr-xr-x. 2 libsys libsys 4096 Feb 20 00:05 daily
  2. drwxrwxr-x. 2 root backup 4096 Feb 20 10:00 hourly
  3. -rw-rw-r--. 1 root backup 35644 Feb 20 10:00 log.txt
  4. drwxrwxr-x. 2 root backup 4096 Feb 13 11:23 manual
  5. drwxrwxr-x. 2 aberry3 aberry3 4096 Feb 6 10:36 monthly
  6. drwxrwxr-x. 2 aberry3 aberry3 4096 Feb 6 10:36 weekly

看起来很腥.我猜测实际用户 – 假设你真的没有名为my_user_group_name的用户 – 不是aberry3.如果我采取疯狂猜测,我会说libsys正在运行脚本谁是备份的成员,但不是aberry3组的成员.

由于您无论如何都要在脚本中创建目录,请尝试重命名现有目录,然后让脚本使用运行脚本的实际用户的所有者/组创建它们.

猜你在找的CentOS相关文章