Habe ein PowerShell-Skript, aus dem ich den folgenden Befehl ausführe:putty.exe -ssh user@srv -pw password -m Execute_Command_File -t
Während des Skripts tailf /dir/log/
wird der Befehl in Execute_Command_File geschrieben. Nach der Ausführung des Skripts wird die angeforderte Sitzung geöffnet und tailf
funktioniert.
Das Problem: Wenn ich versuche, das Programm zu beenden tailf
(Strg+C), wird das Terminal geschlossen.
/bin/bash
Habe versucht , am Ende hinzuzufügen Execute_Command_File
, hat nicht geholfen. Und natürlich versucht tail -f/F
, hat auch nicht funktioniert ...
Irgendwelche Ideen?
Antwort1
Es kommt vor, dass tail
Bash aufgrund von STRG+C abbricht, aber es wird auch (SINGINT) an das übergeordnete Element gesendet. bash
Da Bash standardmäßig abbricht, wenn ein solches Signal empfangen wird, müssen Sie das Standardverhalten ändern, bash
wenn es empfangen wird.
Verwendenfangenintegrierter Befehl, um bash(1)
dies zu ändern.
Das folgende Skript tailf-ctrl.sh
ist eine Demo und zeigt die Antwort:
#!/bin/bash
function finish {
echo "CTRL-C pressed!"
}
F=testfile
echo hello > $F
# set custom action
trap finish SIGINT # comment this to see the problem
tail -f $F
# reset default action
trap - SIGINT
echo "Hello after" > after
cat after
beachten Sie, dass:
- ZEICHENist das Signal, das mit STRG+C zusammenhängt
- ErstefangenInstallieren Sie eine benutzerdefinierte Aktion im Zusammenhang mit dem SIGINT-Signal
- zweitefangenStandardverhalten des SIGINT-Signals zurücksetzen
Die Ausgabe des Skripts lautet:
$ bash tailf-ctrl.sh
hello
^CCTRL-C pressed!
Hello after
das zeigt, dass die zweite Datei so geschrieben wird, dass das Ende des Skripts erreicht ist, wenn tail
es aufgrund von abbricht CTRL-C
.
Wenn Sie den ersten Trap-Befehl auskommentieren, sehen Sie, dass Ihr Problem auftritt: Bash wird sofort beendet und die Ausgabe sollte wie folgt aussehen:
$ bash tailf-ctrl.sh
hello
^C
$