2016-11-03 3 views
1

Если сценарий для использования другого сценария для резервных копий rsync, введите Time Machine.Anormally exit form bash script

Но когда закончить первую пользовательскую программу остановить

backup.sh

#!/bin/bash                                                                      
while read A; do 
    echo $A 
    ssh [email protected] "[[ -d /Volumes/MACBACKUP/desarrollo_backups/$A ]] || mkdir /Volumes/MACBACKUP/desarrollo_backups/$A; touch /Volumes/MACBACKUP/desarrollo_backups/$A/backup.marker" 
    bash /home/vagrant/rsync_tmbackup.sh $A/ [email protected]:/Volumes/MACBACKUP/desarrollo_backups/$A/ 
done < cuentas.txt 

Файл cuentas.txt

account1 
account2 
.. 
accountN 

При запуске backup.sh

account1 # comment first iteration on while 
rsync_tmbackup: Previous backup found - doing incremental backup from [email protected]:/Volumes/MACBACKUP/desarrollo_backups/account1/2016-11-03-075246 
rsync_tmbackup: Creating destination [email protected]:/Volumes/MACBACKUP/desarrollo_backups/account1/2016-11-03-080415 
rsync_tmbackup: Starting backup... 
rsync_tmbackup: From: castris 
rsync_tmbackup: To: [email protected]:/Volumes/MACBACKUP/desarrollo_backups/account1/2016-11-03-080415 
rsync_tmbackup: Running command: 
rsync_tmbackup: rsync -e 'ssh -p 22 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' -D --compress --numeric-ids --links --hard-links --one-file-system --itemize-changes --times --recursive --perms --owner --group --log-file '/home/vagrant/.rsync_tmbackup/2016-11-03-080416.log' --link-dest='/Volumes/MACBACKUP/desarrollo_backups/account1/2016-11-03-075246' -- 'castris/' '[email protected]:/Volumes/MACBACKUP/desarrollo_backups/account1/2016-11-03-080415/' | grep -E '^deleting|[^/]$' 
Warning: Permanently added '192.168.1.33' (ECDSA) to the list of known hosts. 
rsync_tmbackup: Backup completed without errors. # Here finish first iteration on while, and muts be with second iteration, but bash end while 

И прекрати , inste объявление сделало резервную копию для следующей учетной записи пользователя2

ответ

1

Вы могли бы использовать «ssh -n», как показано ниже;

#!/bin/bash                                                                      
while read A; do 
echo $A 
ssh -n [email protected] "[[ -d /Volumes/MACBACKUP/desarrollo_backups/$A ]] || mkdir /Volumes/MACBACKUP/desarrollo_backups/$A; touch /Volumes/MACBACKUP/desarrollo_backups/$A/backup.marker" 
bash /home/vagrant/rsync_tmbackup.sh $A/ [email protected]:/Volumes/MACBACKUP/desarrollo_backups/$A/ 
done < cuentas.txt 

человек SSH;

-n Переадресовывает stdin из/dev/null (фактически, предотвращает чтение из stdin). Это необходимо использовать, когда ssh запускается в фоновом режиме. A Общей трюкой является использование этого для запуска программ X11 на удаленной машине. Например, ssh -n shadows.cs.hut.fi emacs & запустит emacs на shadows.cs.hut.fi, а соединение X11 будет автоматически перенаправлено по зашифрованному каналу. Программа ssh будет помещена в фон. (Это не работает , если SSH необходимо запрашивать пароль или парольную фразу, см также -f.)

+0

ssh -n не разрешается. Проблема заключается в том, что «после» запустить bash-программу rsync_tmbackup.sh, а не после запуска команды ssh. Благодарю. – abkrim

+0

@abkrim, вы также используете команду ssh в файле rsync_tmbackup.sh. вы также можете изменить это в своем скрипте; rsync -e 'ssh -n -p ... –

+0

Почему? Мне не нравится запускать команду ssh. Мой вопрос - это другое. Вопрос в том, что это сценарий сбоя bash после запуска первой итерации. ssh это строка программы. bash ... это вторая строка на скрипте bash. – abkrim

0

Я уверен, @MustafaDOGRU прав относительно основной задачи: при запуске цикла, read читает первую строку cuentas.txt (как и ожидалось), но затем что-то в середине цикла читает остальную часть файла, поэтому, когда сценарий пытается read, следующая строка ... ничего не осталось, и поэтому она фигурирует это сделано и завершается. Подход Мустафы состоял в том, чтобы попытаться выяснить, какая часть середины цикла читала, и заставить ее остановиться, но похоже, что это делают несколько вещей, и отслеживание их может быть раздражающим. Но есть и другой путь: передать содержимое файла на что-то другое, чем стандартный ввод:

#!/bin/bash                                                                      
while read -u3 A; do 
    echo $A 
    ssh [email protected] "[[ -d /Volumes/MACBACKUP/desarrollo_backups/$A ]] || mkdir /Volumes/MACBACKUP/desarrollo_backups/$A; touch /Volumes/MACBACKUP/desarrollo_backups/$A/backup.marker" 
    bash /home/vagrant/rsync_tmbackup.sh $A/ [email protected]:/Volumes/MACBACKUP/desarrollo_backups/$A/ 
done 3< cuentas.txt 

3< cuentas.txt направляет cuentas.txt в файл дескриптора # 3, а не стандартный ввод (который FD # 0), а read -u3 читается с fd # 3, поэтому они должны работать вместе. Так как fd # 3 обычно не используется, вероятность того, что что-либо в середине цикла, возится с ним, довольно мало.

+0

Хорошо. Все. Я поставил другой скрипт. Этот скрипт выполняет тот же процесс, но не запускает bash /home/vagrant/rsync_tmbackup.sh. Результат? Конечно, берите все итерации без каких-либо проблем. У меня много скриптов с циклами, для запуска нескольких процессов o удаленных компьютеров, и это первый раз с этой проблемой. http: //paste.tamainut.info/view/e6766181 Этот код, выполните удаленную команду, создайте удаленные dirs и после – abkrim

+0

@abkrim. Я не уверен, что правильно понимаю вас, но если некоторые скрипты работают без использования трюка fd 3, это потому, что ничего внутри цикл считывается со стандартного ввода. В общем, 'при чтении A; do ... done <файл' * может * работать в зависимости от того, что внутри цикла; но 'при чтении -u3 A; do ... сделано 3 <файл' * будет * произведение, почти для любого содержимого петли. –