Я использую следующий скрипт для перезапуска Java-сервера, работающего на Solaris Sun 5.10 ...

pkill -9 java

nohup ./start_java.sh &

tail -f smx.log

Я SSH к коробке (с помощью Putty), чтобы запустить скрипт.

Это работает нормально, пока я ctrl-c из tail -f прежде чем закрыть шпаклевку. Если я не остановлю хвост (просто закройте окно замазки), это убьет процесс start_java .

С тех пор я изменил сценарий, чтобы удалить tail -f , но я не понимаю, почему это произойдет?

3 ответа3

2

Напишите скрипт, который делает это:

#!/bin/bash    
trap 'echo hup' hup
trap 'echo int' int
trap 'echo quit' quit
trap 'echo abrt' abrt
trap 'echo kill' kill
trap 'echo usr1' usr1
trap 'echo usr2' usr2
trap 'echo term' term
trap 'echo chld' chld
trap 'echo cont' cont
trap 'echo stop' stop
trap 'echo tstp' tstp
trap 'echo ttin' ttin
trap 'echo ttou' ttou

shopt huponexit
sleep 10
echo $(date) process $$ done

Напишите второй скрипт, который выполняет : > nohup.out; nohup firstscript& echo sleeping; sleep 10 . Запустите второй скрипт, подождите секунду или две, затем закройте терминал PuTTY. Откройте новый терминал PuTTY и проверьте файл nohup.out. Он должен сказать вам, какой сигнал получил первый скрипт, который заставил его остановиться. Это поможет вам понять, как поступить. Вы можете попробовать сделать trap '' THEGUILTYSIGNAL для одной вещи.

Это также должно сказать вам значение huponexit. Если это включено , вы можете поэкспериментировать с shopt -u huponexit и посмотреть, улучшится ли это. (Улучшение = вы можете запустить второй скрипт, затем закрыть свой терминал PuTTY, но первый скрипт все еще выполняется до конца.)

0

Nohup должен работать, но, по моему опыту, иногда клиенты на самом деле вздыхают, а не вздыхают, так что в итоге он убивает ваши процессы, а не просто говорит им повесить трубку (как предотвращает nohup). Экран - это одно из возможных решений проблемы, поскольку он игнорирует sigkill, но у него также есть свои проблемы, с которыми вам придется работать.

Может быть, из-за запущенного процесса ваш терминал (или Putty) отправляет сигкилл.

0

В то время как screen вероятно, лучший способ справиться с этим, одна альтернатива, если вы сценариев с bash было бы disown ваш процесс start_java.sh после его запуска. Это отсоединяет процесс от терминала, поэтому при закрытии PuTTY любой SIGKILL, отправленный запущенным процессам, не будет отправлен этому процессу.

Другой альтернативой может быть использование tcsh , который автоматически закрывает фоновые процессы при выходе, а не SIGKILL'ом.

Я думаю, что вы можете просто добавить disown в ваш скрипт следующим образом:

#!/bin/bash
# might need to specify bash in the line above for this to work right

pkill -9 java
nohup ./start_java.sh &
disown

tail -f smx.log

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .