1
#!/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 !如何更改代码以满足周基数rsync?(PS-我不想通过cronjob-学校作业来做到这一点)

4

2 回答 2

1

你说的是要连续运行几周,对吧?因此,我们必须考虑到系统将重新启动并且需要无人值守运行。简而言之,您需要一些方法来确保脚本每周至少运行一次,即使周围没有人也是如此。选项看起来像这样

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

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

选项 3(更好)
为了在数周内保持可靠,一个选项是守护脚本。有关此问题的更详细讨论,请参阅:制作 shell 脚本守护程序的最佳方法?

您需要确保在重新启动或系统故障后启动守护程序。有关该问题的更多讨论,请参阅:使用 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"

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

于 2016-04-29T12:32:35.837 回答
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

这段代码似乎很好用!任何更改都让我知道

于 2016-04-30T04:37:23.147 回答