Ausgaben, die das Skript mit tail -f beenden

1703
Ben ODay

Ich verwende das folgende Skript, um einen Java-Server, der auf einer Solaris Sun 5.10-Box ausgeführt wird, neu zu starten ...

pkill -9 java  nohup ./start_java.sh &  tail -f smx.log 

Ich SSHhabe die Box (benutzt Putty), um das Skript auszuführen.

Es funktioniert gut, solange ich ctrl-c aus dem tail -fKitt vor dem Schließen komme. Wenn ich den Schwanz nicht anhalte (nur das Spachtelfenster schließe), wird der start_javaProzess abgebrochen .

Ich habe das Skript inzwischen geändert, um das zu entfernen tail -f, aber ich bin verwirrt, warum dies passieren würde.

0

3 Antworten auf die Frage

2
dubiousjim

Schreiben Sie ein Skript, das dies tut:

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

Schreiben Sie ein zweites Skript, das dies tut : > nohup.out; nohup firstscript& echo sleeping; sleep 10. Führen Sie das zweite Skript aus, warten Sie ein oder zwei Sekunden und schließen Sie dann Ihr PuTTY-Terminal. Öffnen Sie ein neues PuTTY-Terminal und überprüfen Sie die Datei nohup.out. Es sollte Ihnen sagen, welches Signal das erste Skript erhalten hat, durch das es angehalten wurde. Das hilft Ihnen, herauszufinden, wie Sie vorgehen müssen. Sie könnten versuchen, trap '' THEGUILTYSIGNALeine Sache zu tun.

Es sollte auch den Huponexit-Wert angeben. Wenn dies aktiviert ist, können Sie damit experimentieren shopt -u huponexitund sehen, ob dies die Sache verbessert. (Verbesserung = Sie können das zweite Skript ausführen und dann Ihr PuTTY-Terminal schließen, das erste Skript wird jedoch noch vollständig ausgeführt.)

0
Chuck Vose

Nohup sollte funktionieren, aber meiner Erfahrung nach ist es manchmal so, dass Kunden tatsächlich sigkill statt seufzen, so dass Ihre Prozesse beendet werden und nicht nur gesagt wird, dass sie auflegen sollen (wie Nohup dies verhindert). Bildschirm ist eine mögliche Lösung für das Problem, da es Sigkill ignoriert, aber es hat auch seine eigenen Probleme, die Sie umgehen müssen.

Es kann sein, dass ein laufender Prozess dazu führt, dass Ihr Terminal (oder Putty) Sigkill sendet.

0
quack quixote

Während dies screenwahrscheinlich der beste Weg ist, um damit umzugehen bash, wäre eine Alternative, wenn Sie mit Skripten arbeiten, für disownIhren start_java.shProzess, nachdem Sie ihn gestartet haben. Dadurch wird der Prozess vom Terminal getrennt, sodass beim Schließen von PuTTY keine an laufende Prozesse gesendeten SIGKILL an diesen Prozess gesendet werden.

Eine andere Alternative wäre die Verwendung tcsh, bei der Hintergrundprozesse automatisch deaktiviert werden, anstatt sie von SIGKILL zu beenden.

Ich denke, Sie können einfach so disownin Ihr Skript einfügen:

#!/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 
Ich dachte, Disown hätte _supposed_ den gleichen Effekt wie nohup. Ich habe gerade ein Skript geschrieben, um dies zu testen, indem ich `nohup foo &; ps -p $! -o pid, ppid, blockiert, gefangen, ignoriert, ausstehend, pgrp, sess; verleugnen; schlaf 1; ps -p $! -o pid, ppid, blockiert, gefangen, ignoriert, ausstehend, pgrp, sess`. Und sess ändert sich nicht, so dass "disown" den Prozess nicht vom Terminal "in diesem Sinne" trennt. Es gibt jedoch einen Unterschied: SIGCHLD wird blockiert und TTIN und TTOU werden erwischt. Ich bin nicht sicher, ob diese Unterschiede hier helfen würden. dubiousjim vor 14 Jahren 0
@profjim - disown sollte den Prozess zu einem Kind von `init` machen, wenn ich es richtig verstanden habe, also sollte man die PPID-Änderung sehen. aber ich bin mir ehrlich gesagt nicht sicher; Ich muss mich wirklich hinsetzen und experimentieren, wofür ich keine Zeit hatte. quack quixote vor 14 Jahren 0
@quack, nicht mit bash 4.1.2. es scheint nicht zu PPID, PGRP, SESS bleiben alle gleich. Ich war selbst verwirrt, ob es überhaupt nützlich ist, etwas zu verbergen, das Sie überhaupt nicht gemacht haben. (Interaktiv ist disown nützlich, wenn Sie _ohne_nicht bereits beim ersten Aufruf nohup verwenden.) dubiousjim vor 14 Jahren 0
@profjim - Sie haben vielleicht recht, ich erinnere mich vielleicht an diese Situation (disown, wenn Sie nohup nicht verwendet haben). quack quixote vor 14 Jahren 0