Ich habe das Problem durch Hinzufügen eines Delay-after-Tail-Befehls behoben.
nohup tail -f -n0 /path/to/log/files/*/*server.log > "$FILENAME" 2> test.err < /dev/null & echo "$!" > "$REG_DIR"/reg_tail.pid #without this delay, the above tail command is not being executed when only one 1 argumet is passed sleep 1 #if slave host is provided, start tailing logs on slave also if [ "$#" -gt 1 ]; then
Ich habe mich gefragt, warum es funktioniert, nachdem der Befehl ssh ausgeführt wurde, obwohl er nicht verwandt ist. Also entschied ich mich, eine Verzögerung hinzuzufügen. Ich bin zwar kein Experte, aber es sieht aus wie ein Rennzustand. Der Tail-Hintergrundprozess wurde so geplant, dass er am Ende ausgeführt wird. In dem Fall, in dem kein ssh-Befehl ausgeführt wurde, wurde das Skript beendet und die Sitzung wurde beendet, bevor der Tail-Prozess eine Chance zur Ausführung erhielt. Wenn der Hauptprozess in den Ruhezustand versetzt wird, besteht die Möglichkeit, den Prozess (oder den Thread) zu beenden. Ich bin mir nicht sicher, ob diese Lösung die beste ist. Wenn ich warten wende statt schlafe, bleibt es hängen, weil "tail -f" weiter läuft. Ich verwende dieses Skript, um Protokolle zu beenden und dann einen Testfall auszuführen. Nachdem die Testfallausführung abgeschlossen ist, führe ich ein anderes Skript aus, das die PID des Schwanzes von dort abliest, wo es gespeichert ist und den Schwanz tötet.