bash脚本每天运行但不是每月1日运行

时间:2014-05-01 15:39:14

标签: linux bash shell if-statement

我正在编写更多bash备份脚本,但有一点问题。

每月1日我运行server1.sh进行完整备份。 每隔一天我运行server2.sh,查看server1备份并根据此完整备份执行增量备份。

这一切都很棒。

我的第一个问题是如何告诉server2.sh不要在每个月的第一天运行,因为server1.sh将在今天运行。

使用crontab运行这些脚本。

示例cron

  • 0 1 * * server1.sh
  • 2 * * * server2.sh

到目前为止,我的脚本使用了if但尚未完全正常工作

#!/bin/bash


LinkDest=/home/backup/website/full
r_date=$(date "+%d-%m-%y")
f_date=$(date +%F)
c_date=$(date +%d)
servers=("123.123.78.90" "123.123.78.91" "123.123.78.92" "123.123.78.93" "123.123.78.94" "123.123.78.95" "cluster")

if [ $c_date -eq 01 ]
  then
      echo "Backup Skipped 1st of Month" 
      exit 0

  else    

for j in "${servers[@]}"
do

echo "server:/data/backup/$j /home/backup/website/$j"

rsync -avz --link-dest=$LinkDest root@123.123.78.90:/data/backup/"$j"     /home/backup/website/$f_date --bwlimit=10000 --log-file=/logs/rsync_"$j"_"$r_date".log

fi
done

1 个答案:

答案 0 :(得分:2)

这是cron表达式的格式:

# Minute   Hour   Day of Month       Month          Day of Week        Command    
# (0-59)  (0-23)     (1-31)    (1-12 or Jan-Dec)  (0-6 or Sun-Sat)                
    0        2          12             *                *            /usr/bin/find

鉴于您的问题,您可以使用以下cron表达式:

  • 除了server2.sh 0 0 2-31 * *

  • 一个月的第一天以外的所有日期
  • 仅限运行server1.sh的第一天:0 0 1 * *

您必须定义运行脚本的分钟和小时。所以用自己的值替换前两个0 0。例如:

20 3 2-31 * *
20 3 1 * *

在凌晨3点20分运行脚本。

希望这有帮助!