2016-04-28 4 views
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 [email protected]_address:~/sample.tgz /home/kartik2     
       sleep 1d  
     fi  
done  

Я хочу, чтобы rsync файла каждую неделю !! Но если я запускаю этот скрипт при каждой загрузке, файл будет rsynced каждый раз, когда система запустится! Как изменить код, чтобы удовлетворить недельную основу rsync? (PS- Я не хочу делать это через cronjob - школьное задание)Shell script to rsync файл каждую неделю без cronjob (назначение школы)

+1

'cron' может быть хорошим местом для начала. – Jakuje

+0

Почему нет cron? Он был разработан именно для этой цели: напишите любой скрипт, который вы хотите, и пусть cron возьмет на себя ответственность за планирование его выполнения. –

+0

Я искренне интересуюсь, почему вы не можете использовать cron? – Harry

ответ

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 минут, когда ему не нужно работать. Кроме того, он, естественно, устойчив к перезагрузкам и тому подобному. Таким образом, я вынужден сказать, что создание записи кронтаба вроде следующего будет мой главный голосом: @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" 

Затем нужно будет проверить, если номер недели соответствует этим номер текущей недели и обрабатывать необходимые действия на основе соответствия или нет.

+0

Цените это! Большое спасибо! – kartik

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 [email protected]:~/sample.tgz /home/user 
       if [ $? -eq 0 ] 
       then 
         sleep 1d 
       fi 
     fi 
done 

Этот код работает хорошо и хорошо! Любые изменения в нем дайте мне знать

+0

Почему бы вам не просто использовать 'crontab -e' (если вы хотите, чтобы этот скрипт выполнялся как часть вашего личного crontab) и добавьте' @weekly rsync -v -e ssh HOST @ ip: ~/sample.tgz/главная/user'? '@ weekly' является просто сокращением для' 0 0 * * 0'. –

+0

Потому что мне было поручено не использовать crontab по моему proff !! Без обид – kartik

+0

Ну, тогда - это имеет гораздо больше смысла ':)' –

 Смежные вопросы

  • Нет связанных вопросов^_^