shell脚本每周rsync文件没有cronjob(学校assignement)

时间:2016-04-28 14:50:39

标签: shell date unix rsync daemons

#!/bin/bash
z=1 
b=$(date)    
while [[ $z -eq 1 ]]    
do    
        a=$(date)    
        if [ "$a" == "$b" ]    
        then    
                b=$(date -d "+7 days")    
               rsync -v -e ssh user@ip_address:~/sample.tgz /home/kartik2                
                sleep 1d     
        fi    
done    

我想每周rsync个文件!!但是,如果我在每次启动时启动此脚本,则每次系统启动时文件都将被删除!如何更改代码以满足周基础rsync? (PS-我不想通过cronjob - 学校作业)

这样做

2 个答案:

答案 0 :(得分:1)

你正在谈论这个运行数周,对吧?因此,我们必须考虑到系统将重新启动,并且需要在无人值守的情况下运行。简而言之,您需要一些方法来确保脚本每周至少运行一次,即使没有人在场。选项看起来像这样

选项1(最差)
您为自己设置提醒,然后每周登录并运行脚本。虽然你作为一个人可能是可靠的,但这并不能让你去度假。此外,它违背了我们的原则,当没有人在附近时,"

选项2(好的)
您可以对流程(./once-a-week.sh &)进行后台处理,但这不会随着时间的推移而变得可靠。除此之外,如果系统重新启动,那么您的脚本将无法运行,您也不会知道。

选项3(更好)
为了使其在几周内可靠,一个选项是守护脚本。有关此问题的更详细讨论,请参阅:Best way to make a shell script daemon?

您需要确保在重启或系统故障后启动守护程序。有关该问题的更多讨论,请参阅:Make daemon start up with Linux

选项4(最佳)
你说没有cron,但它确实是最好的选择。特别是,当它不需要运行时,它将在6天,23小时和59分钟内不消耗系统资源。另外,它对于重新启动等具有自然的弹性。所以,我觉得有必要说创建像下面这样的crontab条目将是我的最高投票:@weekly /full/path/to/script

如果选择上面的选项2或3,则需要对脚本进行修改,以包含脚本上次成功完成运行的周数(date +%V)的变量。问题是,只是在内存中拥有它意味着它将不会在重新启动后持续。

为了使上述任何一个更具弹性,最好创建一个目录,您可以在其中存储文件作为信号量(例如week21.txt)或存储上次运行状态的文件。像once-a-week.state这样的东西,你可以在运行时写一个值:

date +%V > once-a-week.state # write the week number to a file

然后读取值,你会:

file="/path/to/once-a-week.state" # the file where the week number is stored
read -d $'\x04' name < "$file"
echo "$name"

然后,您需要检查周数是否与当前周数匹配,并根据匹配情况处理所需的操作。

答案 1 :(得分:1)

#!/bin/bash
z=1
b=$(cat f1.txt)
while [[ $z -eq 1 ]]
do
        a=$(date +"%d-%m-%y")
        if [ "$a" == "$b" ] || [ "$b" == "" ] || [$a -ge $b ]
        then
                b=$(date +"%d-%m-%y" -d "+7 days")
                echo $b > f1.txt
               rsync -v -e ssh HOST@ip:~/sample.tgz /home/user
                if [ $? -eq 0 ]
                then
                        sleep 1d
                fi
        fi
done

这段代码看起来效果很好!!对它的任何更改都让我知道