Angesichts dieser Schleife:
while sleep 10s ; do
something-that-runs-forever
done
Wenn ich Strg + C drücke, wird die gesamte while-Schleife unterbrochen. Was ich tun möchte, ist, den "Etwas" -Prozess zu unterbrechen, 10 Sekunden verstreichen zu lassen und dann "Etwas" neu zu starten.
Wie bewege ich Strg + C nur "etwas" und nicht die while-Schleife?
EDIT: "Interrupt" wie in SIGINT. Töten. Abbrechen. Kündigen. Nicht "unterbrechen" wie in "Pause".
fg
. Warum überhaupt Strg + C verwenden?What I want to do is to interrupt the "something"-process, let 10 seconds pass, and then restart "something"
. Wenn Sie Strg + Z drücken, 10 Sekunden warten und dann ausführenfg
, passiert genau das. Vielleicht könnten Sie Ihre Frage bearbeiten und ein bestimmtes Beispiel geben, damit wir es besser verstehen können?Antworten:
Es sollte funktionieren, wenn Sie nur
trap
SIGINT
zu etwas. Like:
(true
).Wenn Sie das
something...
unterbrechen, wird die Shell jetzt nicht beendet, da das Signal ignoriert wird. Wenn Sie densleep
Prozess jedoch beenden, wird er mit einem Fehler beendet und die Schleife wird aufgrund dessen gestoppt. Bewegen Sie dassleep
in das Innere der Schleife oder fügen Sie etwas hinzu|| true
, um dies zu verhindern.Beachten Sie, dass wenn Sie
trap "" INT
das Signal vollständig ignorieren (anstatt ihm einen Befehl zuzuweisen), es auch im untergeordneten Prozess ignoriert wird, sodass Sie es auch nicht unterbrechensomething...
können. Dies wird zumindest in Bashs Handbuch ausdrücklich erwähnt :quelle
do (trap - INT; something-that-runs-forever)
eine Unterbrechung des Befehls zulassen. Außerdem müssen Sie nicht ausgeführt werden.:
Sie können einfach eine leere Zeichenfolge verwenden, um ein Signal zu ignorieren :trap '' INT
. All dies ist POSIX und sollte auf jeder kompatiblen Shell (nicht nur auf Bash) funktionieren.SIGINT
vollständige Schreiben nicht unbedingt portierbar ist: " Implementierungen können Namen mit demSIG
Präfix zulassen oder Groß- und Kleinschreibung in Signalnamen als Erweiterung ignorieren . " (Meine Betonung)trap "" INT
(auch Posix)trap :
anstatttrap ""
war genau das, um nicht das Signal ignoriert zu haben (aber es ist ein no-op stattdessen machen), so dass wir nicht brauchen , etwas anderes zu tun zu können , die wichtigsten zu unterbrechensomething
Programm.Eine andere Möglichkeit besteht darin,
something-that-runs-forever
das Signal zu verarbeiten (bei Empfang ordnungsgemäß zu beenden). Natürlich ist es nur sinnvoll, wenn dieses Programm in vielen Skripten verwendet wird und das gewünschte Verhalten auf CTRL+ Csystematisch dasselbe ist - um die Skriptausführung fortzusetzen.quelle