Praktisch brauche ich einen Prozess, der sich so verhält, als hätte ich Ctrl+Z
gleich nach dem Start gedrückt .
Hoffentlich ist es möglich, so etwas mit einem Shell-Skript zu machen.
(Außerdem wäre es großartig, die resultierende PID zu kennen, damit ich den Prozess anschließend fortsetzen kann.)
linux
process
background-process
java.ist.für.desktop
quelle
quelle
#!/bin/bash
[enter]$@ &
[enter]PID=$!
[enterkill -STOP $PID
]echo "Suspended: $PID, press ENTER to continue it"
[enter]read
[enter]kill -CONT $PID
[enter]wait $PID
[enter]echo
Aus welcher Umgebung erstellen Sie den Prozess?
Wenn Sie dies in einer Umgebung wie C-Code tun, können Sie fork () ausführen und anschließend im untergeordneten Element ein SIGSTOP vor exec () an sich selbst senden, um die weitere Ausführung zu verhindern.
Eine allgemeinere Lösung (wahrscheinlich die beste) wäre, einen Stub zu erstellen, der dies tut. Das Stub-Programm würde also:
Dies stellt sicher, dass Sie vermeiden, dass Rennbedingungen, die mit der neuen Verarbeitung zusammenhängen, zu weit gehen, bevor Sie ein Signal an sie senden können.
Ein Beispiel für die Shell:
Und obige Codez verwenden:
Das
jobs -l
zeigt die PID. Wenn Sie dies jedoch aus einer Shell heraus tun, benötigen Sie die PID nicht direkt. Sie können einfach Folgendes tun:kill -CONT %1
(vorausgesetzt, Sie haben nur einen Job).Machst du es mit mehr als einem Job? Links als Übung für den Leser :)
quelle
MikeyBs Antwort ist richtig. Von dieser Frage auf Superuser, hier ist eine prägnante Version:
Um dies zu verstehen, muss man verstehen, wie Prozesse unter Unix gestartet werden: Der
exec
Systemaufruf ersetzt das aktuell ausgeführte Programm durch ein neues , wobei die vorhandene PID erhalten bleibt. So die Art und Weise ein unabhängiger Prozess erstellt wird , ist zuerstfork
, und dannexec
, das laufende Programm in dem untergeordneten Prozess mit dem gewünschten Programm zu ersetzen.Die Bestandteile dieses Shell-Befehls sind:
(...)
starten eine Sub-Shell: eine weitere Instanz von BASH.kill
Befehl sendet das STOP-Signal an diesen Prozess, wodurch er in den angehaltenen Zustand versetzt wird.CONT
Signal senden), wird es durch denexec
Befehl veranlasst , sich durch Ihr gewünschtes Programm zu ersetzen .my_command
behält die ursprüngliche PID der Unterschale bei.$!
Variable verwenden, um die PID des Prozesses abzurufen.quelle
-s STOP
anstelle von verwenden musste-SIGSTOP
). Immer noch wundern: warum muss es$BASHPID
statt sein$$
? (Ich kann den Unterschied nicht wirklich verstehen).$$
vs$BASHPID
überprüfe ich, ob letzteres die PID der Unterschale ist, während erstere nicht. Es gibt ein lustiges Problem: Das Anwenden des Trinkgeldes in einem Bash-Skript schlägt meistens fehl und ich muss Folgendes tun:PID=$!; ps -p $PID; kill -s CONT $PID;
… es schlägt fehl, wenn ich denps -p $PID
Teil entferne : Der Prozess scheint irgendwo ohne Fehlermeldung zu verschwinden (getötet?) . Von einer interaktiven Shell aus ist es in Ordnung, das Problem liegt nur im Skript. Das ist zu mysteriös.$BASHPID
von anderen Muscheln als Bash finden Sie hier