У меня очень простой скрипт bash. Я хочу, чтобы этот скрипт bash продолжал работать после выхода из терминала, поскольку он отслеживает некоторые службы. Однако у меня есть проблема, что, как только я выйду из терминала, процесс прекратится.nohup не работает должным образом
Я запустить процесс, как:
nohup ./test.sh > test.log &
проверить процесс с помощью:
ps -aux | grep test.sh
Когда я запускаю процесс я проверяю, что скрипт работает. Однако, когда я снова подключаюсь, скрипт больше не работает.
Содержание файла test.sh является следующее:
#!/bin/bash
while :
do
echo `date`": ****** Scheduled Test *****"
result1=$(wget "127.0.0.1" -q -O -)
result2=$(wget "127.0.0.1" -q -O -)
echo ": $result1"
echo ": $result2"
if [[ $result1 == *"Running OK"* ]] && [[ $result2 == *"Running OK"* ]];
then
echo "***** Running OK ***** :)"
sleep 60
continue
fi
echo "@@@@@ Not Running @@@@@"
echo "-----> Killing JARS"
kill -9 `lsof -i:4445 | cut -d' ' -f5`
kill -9 `lsof -i:4423 | cut -d' ' -f5`
./runsomejar.sh > jar1.log &
echo "-----> Restarting jar1"
sleep 60
echo "-----> Restarting jar2"
./runsomejar.sh > jar2.log &
sleep 180
done
Не уверен, но предложения: (1) Перенаправление стандартные ошибки в лог-файл тоже; если вы чувствуете себя параноидальным, перенаправляйте стандартный ввод из '/ dev/null'; (2) рассмотрите возможность добавления обработчиков сигналов для HUP, INT, QUIT, TERM, PIPE и любых других сигналов, которые, по вашему мнению, могут быть релевантными (HUP и TERM являются наиболее важными на мой взгляд), и каждый обработчик сигнала должен сообщить, какой сигнал был получено. Затем перезапустите скрипт и отсоедините его и снова подключите. Вы также можете добавить timestamping в файл журнала, по крайней мере, в начале каждой итерации (и обработчиков сигналов тоже), чтобы вы знали, когда что-то происходит. –
[Как закрыть терминал, не убивая запущенную в нем команду?] (Http://unix.stackexchange.com/q/4004), [Сохранение процесса, запущенного после закрытия или закрытия терминала) (http://unix.stackexchange.com/q/89483), [Избегайте задержек от сетевых вызовов в сценариях входа и выхода из системы] (http://unix.stackexchange.com/q/289221) и т. д. Я нашел, что мне нужно использовать 'disown 'для достижения наилучших результатов. Лучшие результаты включают, когда сообщения извергаются после отсоединения ребенка. – jww
Вы можете использовать команду 'disown' от вашего терминала, чтобы, предположительно, достичь того же, но обратите внимание, что большинство систем имеют возможность делать именно то, что вы хотите: запустить и контролировать процесс и перезапустить его, если он умрет. Чтение в 'init scripts' и т. П. (Фактический метод зависит от системы). – gilez