Сценарий ломается, когда терминал закрывается, даже когда запущен в фоновом режиме
Итак, я запускаю приведенный ниже скрипт с типичным синтаксисом nohup:
nohup ./script &
Часть вывода журнала ниже - это то, что показано, когда у меня есть временное подключение к Интернету, и окна моего терминала закрыты, что вынуждает меня закрывать их вручную. Когда моя проблема решена, я снова вхожу в систему и вижу этот вывод из журнала:
Вывод журнала: (из результатов2.log)
--------------
UPDATE table where id between 45759776 and 55759776
--------------
Terminal close -- sending "KILL QUERY 3329619" to server ...
Terminal close -- query aborted.
Bye
--------------
Содержимое скрипта:
#!/bin/bash
first=5759776
last=15759776
while [ $first -lt 73843165 ]; do
mysql -u -p??????? db -vvv -e "UPDATE table where pc.id between $first and $last;" >> results2.log
((first=first+10000000))
((last=last+10000000))
done
Итак, в основном два вопроса:
- Почему это не работает в фоновом режиме, когда я закрыл терминалы?
- Как я могу предотвратить это в будущем?
1 ответ
Добавьте обработчик ловушек в ваш скрипт, чтобы перехватывать такие сигналы, как:
#!/bin/bash
trap "echo 'trap recieved';" SIGHUP SIGINT SIGTERM
first=5759776
last=15759776
....
Процесс может получить сигнал, чтобы сообщить им о некоторых событиях. Вы можете отправлять сигналы с помощью команды kill. Также другие процессы посылают сигналы процессу как родительский процесс. с помощью этой команды вы можете поймать сигнал. если вы не поймаете их, процесс прекратится. единственный сигнал -9, где вы не можете поймать как: kill -9 processid;