#!/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
- 学校作业)
答案 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
这段代码看起来效果很好!!对它的任何更改都让我知道