Проблемы конечный сценарий с хвостом-f

Я использую следующий сценарий для перезапуска сервера 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, но я смущен относительно того, почему это произошло бы?

0
задан 26.10.2012, 14:36

3 ответа

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

#!/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, но первый сценарий все еще работает к завершению.)

2
ответ дан 24.11.2019, 06:57

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

Может случиться так, что наличие рабочего процесса делает Ваш терминал (или Шпаклевка) отправляют sigkill.

0
ответ дан 24.11.2019, 06:57

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

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

Я думаю, что можно просто добавить 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
0
ответ дан 24.11.2019, 06:57

Теги

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