Проблемы, заканчивающиеся скриптом с tail -f

1387
Ben ODay

Я использую следующий скрипт для перезапуска 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

3 ответа на вопрос

2
dubiousjim

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

#!/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
Chuck Vose

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

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

0
quack quixote

Хотя 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 
Я думал, что отречение имеет тот же эффект, что и nohup. Я только что написал скрипт для проверки этого, запустив `nohup foo &; ps -p $! -o pid, ppid, заблокирован, пойман, игнорируется, в ожидании, pgrp, sess; открестился; сон 1; ps -p $! -o pid, ppid, заблокирован, пойман, игнорируется, в ожидании, pgrp, sess`. И sess не меняется, поэтому disown не «отделяет процесс от терминала» в этом смысле. Но есть некоторая разница: SIGCHLD блокируется, а TTIN и TTOU попадают в ловушку. Я не уверен, что эти различия помогут здесь. dubiousjim 14 лет назад 0
@profjim - disown должен сделать процесс дочерним для `init`, если я правильно понимаю, поэтому вы должны увидеть изменение PPID. но я честно не уверен; Мне действительно нужно сесть и поэкспериментировать, чего у меня не было времени. quack quixote 14 лет назад 0
@ Quack, а не с Bash 4.1.2. это не кажется PPID, PGRP, SESS все остаются прежними. Я сам был озадачен, есть ли какой-то смысл отречься от чего-то, что ты сделал в первую очередь. (Интерактивно, disown полезна, если вы _did't_ уже использовали nohup при первоначальном вызове.) dubiousjim 14 лет назад 0
@profjim - вы можете быть правы, возможно, я неправильно помню эту ситуацию (отрекайтесь, когда вы не использовали nohup). quack quixote 14 лет назад 0

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