Контекст:Bash не улавливать прерывания во время Rsync/подоболочка EXEC заявления
У меня есть Баш скрипт, который содержит подоболочку и ловушку для EXIT pseudosignal, и это не правильно улавливать прерывания во время rsync
. Вот пример:
#!/bin/bash
logfile=/path/to/file;
directory1=/path/to/dir
directory2=/path/to/dir
cleanup() {
echo "Cleaning up!"
#do stuff
trap - EXIT
}
trap '{
(cleanup;) | 2>&1 tee -a $logfile
}' EXIT
(
#main script logic, including the following lines:
(exec sleep 10;);
(exec rsync --progress -av --delete $directory1 /var/tmp/$directory2;);
) | 2>&1 tee -a $logfile
trap - EXIT #just in case cleanup isn't called for some reason
Идея сценария заключается в следующем: большинство важных логики работает в субоболочке, который передается по конвейеру через tee
и в лог-файл, так что я не должен tee
каждый линия основная логика, чтобы все это регистрировалось. Всякий раз, когда заканчивается подоболочка или сценарий останавливается по какой-либо причине (псевдосигнал EXIT должен фиксировать все эти случаи), ловушка будет перехватывать его и запускать функцию cleanup()
, а затем удалять ловушку. Командыи sleep
(сон как раз пример) выполняются через exec
, чтобы предотвратить создание процессов зомби, если я убью родительский скрипт во время их работы, и каждая потенциально долго работающая команда завернута в свою собственную подоболочку так что, когда закончится exec
, он не завершит весь сценарий.
Проблема:
Если я прерываю скрипт (через kill
или CTRL + C) во время ехеса/субоболочки завернутых sleep
команду, ловушка работает должным образом, и я вижу «Очистка!» эхом и протоколирован. Если я прерываю скрипт во время команды rsync
, я вижу rsync
конец и записываю rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [sender=3.0.6]
на экран, а затем скрипт просто умирает; без очистки, без улавливания. Почему прерывание/убийство rsync
не запускают ловушку?
Я попытался использовать переключатель --no-detach
с rsync, но ничего не изменил. У меня есть bash 4.1.2, rsync 3.0.6, centOS 6.2.
Это не повод для вашей проблемы, но ваш журнал не является надежным, потому что вы одновременно записываете две разные программы в один и тот же файл. – ceving
ваш 'trap - EXIT' находится в подоболочке (явно), поэтому он не будет иметь эффекта после возвращения функции очистки. – sehe
Запуск exec в подоболочке такой же, как и обычный запуск команды - вам не нужно дополнительная пунктуация. –