Невозможно остановить сценарий bash с помощью Ctrl + C

Измените

mail -s "Backup of /var/log/messages was successful!" $admin

на

echo hello | mail -s "Backup of /var/log/messages was successful!" $admin

или

mail -s "Backup of /var/log/messages was successful!" $admin < /dev/null

Первый вариант, вы можете использовать любой текст для тела сообщения. Второй вариант отправит электронное письмо с пустым телом сообщения. Повторите то же изменение для второй команды электронной почты в случае неудачного резервного копирования.

В целях обучения вы должны проверить успешное завершение создания tar-файла, его копирование и удаление, прежде чем определять, что оно было успешным.Для этого вы можете сделать это.

Измените

tar -czvf $of messages

на

tar -czvf $of messages && cp $of /home/user/ && rm -rf $of

Кроме того, с помощью этого изменения вы удалите cp $ из / home / user / и rm -rf $ из из конца сценарий.

Тогда ваш if / else будет выполняться на основе успешного завершения всех трех команд или неудачного завершения любой из трех команд в этой строке.

42
18.09.2015, 05:55
2 ответа
pgrep -f process_name > any_file_name
sed -i 's/^/kill /' any_file_name
chmod 777 any_file_name
./any_file_name

например, pgrep -f firefox выберет PID запущенного firefox и сохранит этот PID в файл с именем any_file_name. Команда 'sed' добавит kill в начало номера PID в файле 'any_file_name'. Третья строка будет исполняемым файлом any_file_name. Теперь четвертая строка уничтожит PID, доступный в файле любое_имя_файла. Запись вышеуказанных четырех строк в файл и выполнение этого файла может выполнить Control-C. Работает абсолютно нормально для меня.

0
27.01.2020, 19:35

Если кого-то интересует исправление для этой bashфункции, а не столько философия, стоящая за ней , вот предложение:

Не запускайте проблемную команду напрямую, а из оболочки, которая a )ожидает ее завершения b )не связывается с сигналами, а c )не не реализует сам механизм WCE, но просто умирает при получении SIGINT.

Такую оболочку можно сделать с помощью awk+ ее system()функции.

$ while true; do awk 'BEGIN{system("ping -c5 localhost")}'; done
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.082 ms
64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.087 ms
^C
--- localhost ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1022ms
rtt min/avg/max/mdev = 0.082/0.084/0.087/0.009 ms
[3]-  Terminated              ping -c5 localhost

Вставить скрипт как у OP:

#!/bin/bash
while true; do
        echo -e "\n*** DATE:" `date` " ***";
        echo "********************************************"
        awk 'BEGIN{system(ARGV[1])}' "ping -c5 ${1-localhost}"
done
1
27.01.2020, 19:35

Теги

Похожие вопросы