2016-11-15 5 views
2

У меня очень простой скрипт 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 
+0

Не уверен, но предложения: (1) Перенаправление стандартные ошибки в лог-файл тоже; если вы чувствуете себя параноидальным, перенаправляйте стандартный ввод из '/ dev/null'; (2) рассмотрите возможность добавления обработчиков сигналов для HUP, INT, QUIT, TERM, PIPE и любых других сигналов, которые, по вашему мнению, могут быть релевантными (HUP и TERM являются наиболее важными на мой взгляд), и каждый обработчик сигнала должен сообщить, какой сигнал был получено. Затем перезапустите скрипт и отсоедините его и снова подключите. Вы также можете добавить timestamping в файл журнала, по крайней мере, в начале каждой итерации (и обработчиков сигналов тоже), чтобы вы знали, когда что-то происходит. –

+0

[Как закрыть терминал, не убивая запущенную в нем команду?] (Http://unix.stackexchange.com/q/4004), [Сохранение процесса, запущенного после закрытия или закрытия терминала) (http://unix.stackexchange.com/q/89483), [Избегайте задержек от сетевых вызовов в сценариях входа и выхода из системы] (http://unix.stackexchange.com/q/289221) и т. д. Я нашел, что мне нужно использовать 'disown 'для достижения наилучших результатов. Лучшие результаты включают, когда сообщения извергаются после отсоединения ребенка. – jww

+0

Вы можете использовать команду 'disown' от вашего терминала, чтобы, предположительно, достичь того же, но обратите внимание, что большинство систем имеют возможность делать именно то, что вы хотите: запустить и контролировать процесс и перезапустить его, если он умрет. Чтение в 'init scripts' и т. П. (Фактический метод зависит от системы). – gilez

ответ

0

Вы можете использовать screen:

screen -L ./test.sh 

Вы можете использовать Ctrl-A и d отсоединить экран.

Вы можете войти без убийства test.sh

Вы можете войти обратно, и введите

screen -r 

вернуться к вашему сценарию.

Stdout будут регистрироваться screenlog.0

+0

Downvoter: конструктивная критика приветствуется! –

+0

Im not downvoting, но это использование внешнего приложения. Я борюсь с подобной проблемой на маршрутизаторе, где установка вещей невозможна, а окружающая среда очень минималистична. –