Ist es möglich, einen angehaltenen Prozess mit dem sleep
Befehl aufzuwecken ?
Nehmen wir als Beispiel an, Sie haben dieses Skript:
#!/bin/bash
echo "I am tired"
sleep 8h
echo "I am fresh :)"
Nach 30 Minuten stellen Sie fest, dass Sie das Skript zum Stoppen benötigen, das heißt, Sie wünschten, Sie hätten sleep 30m
stattdessen geschrieben .
Sie möchten weder anrufen kill PID
noch Ctrl+ drücken C, da dann der letzte Befehl nicht ausgeführt wird und Sie müde bleiben.
Gibt es eine Möglichkeit, den Prozess von sleep
einem anderen Befehl aufzuwecken oder einen anderen Befehl zu verwenden, der das Aufwecken unterstützt? Lösungen für Hintergrund- und Vordergrundprozesse sind willkommen.
command-line
bash
Bittenus
quelle
quelle
gawk
funktioniert nicht wirklich. Das letzte Mal, als ich einensleep
Prozess hatte, habe ichpushd
ihn vom Bett genommen.#!
Zeile. Und das ist wichtig, da die Antwort auf Ihre Frage davon abhängt, ob es welche-e
in der#!
Zeile gibt.#!/bin/bash -e
, wird das Skript nach einem Fehler beendet. Das einfache Beenden des Befehls sleep wird von bash als Fehler behandelt. Das heißt, ohne-e
dass es eine recht einfache Antwort auf Ihre Frage gibt. Wenn-e
es verwendet wurde, wird es viel schwieriger, weil Sie den Schlafprozess stoppen müssten, ohne ihn zu töten.Antworten:
Wenn ein Bash-Skript mit a ausgeführt wird
sleep
,pstree
könnte Folgendes aussehen:Beide haben Prozess-IDs (PIDs), auch wenn sie als Skript ausgeführt werden. Wenn wir den Schlaf unterbrechen wollten, würden wir senden
kill 8506
und die Bash-Sitzung würde fortgesetzt ... Das Problem liegt in einer Skriptumgebung vor, in der die PID dessleep
Befehls nicht bekannt ist und kein Mensch den Prozess betrachten kann Baum.Wir können die PID der Bash-Sitzung über die
$$
magische Variable erhalten. Wenn wir das irgendwo speichern kann, können wir dann gezielt Instanzensleep
, die ausgeführt werden unter der PID. Folgendes habe ich in das Skript eingefügt:Und dann können wir sagen
pkill
, dass Nuke-sleep
Instanzen unterhalb dieser PID ausgeführt werden:Dies beschränkt sich wiederum auf nur
sleep
Prozesse, die direkt unter dieser einen Bash-Sitzung ausgeführt werden. Solange die PID korrekt protokolliert wurde, ist sie viel sicherer alskillall sleep
oderpkill sleep
, was jedensleep
Prozess auf dem System gefährden könnte (erlaubte Berechtigungen).Wir können diese Theorie mit dem folgenden Beispiel beweisen, in dem wir drei separate Bash-Sitzungen haben, zwei davon laufen
sleep
. Nur weil wir die PID der Bash-Sitzung oben links angeben, wird nur diese beendetsleep
.Ein alternativer Ansatz besteht darin,
sleep
in den Hintergrund zu treten, seine PID zu speichern und sie dann wieder in den Vordergrund zu stellen. Im Drehbuch:Und um es zu töten:
quelle
Sie können Ihr Skript schreiben, um andere Signale von kill usw. zu verarbeiten ("abzufangen"), damit Sie das Skriptverhalten nach Bedarf ändern können. Siehe man bash:
quelle
Sie könnten einfach den Schlaf beenden, was zur nächsten Zeile des Skripts führen würde:
Beachten Sie, dass hierdurch alle in Ihrem System und nicht nur in Ihrem Skript ausgeführten Schlafvorgänge abgebrochen werden.
quelle
Ich habe ein schlafendes Bash-Skript, das von
cron
on boot gestartet wurde . Das Skript wird jede Minute aktiviert und stellt die Helligkeit der Laptop-Anzeige basierend auf Sonnenaufgang und Sonnenuntergang ein, die über das Internet abgerufen werden. Eine vom Benutzer konfigurierbare Übergangsphase zwischen Vollhelligkeit und Volldunkeligkeit erfordert das Erhöhen und Verringern der Werte um 3, 4, 5 oder was auch immer, die jede Minute berechnet werden.Oli ging
pstree
in seiner Antwort kurz darauf ein, lehnte sie jedoch ab, da dies allesleep
Instanzen töten würde . Dies kann vermieden werden, indem die Suche mithilfe von pstree-Optionen eingegrenzt wird.Unter Verwendung von sehen
pstree -h
wir die gesamte Hierarchie:Wie Sie sehen, enthält eine typische Ubuntu-Anmeldung viele viele PIDs (Prozess-IDs).
Wir können es auf unser laufendes Skript eingrenzen:
Wir sehen:
cron
Shell gestartet (Prozess-ID 1308 und Sitzungs-ID 1308)sleep
unter der Prozess-ID 26552 und erneut der Sitzungs-ID 1308 aufAn diesem Punkt können wir verwenden
pkill -s 1308
und es würde die gesamte Sitzung, die die Shell, unser Programmdisplay-auto-brightness
und densleep
Befehl enthält, beenden . Stattdessen beenden wirkill 26552
nur den Befehl sleep und zwingen unser Programm, aufzuwachen und die Helligkeit anzupassen.Wenn Sie dies manuell in das angezeigte Terminal eingeben:
Der nächste Schritt ist, dies zu tun, wenn der Laptop aus dem Standby-Modus aufwacht. Beispielsweise war der geschlossene Deckel vollständig dunkel und die Bildschirmhelligkeit wurde auf "300" eingestellt. Wenn der Deckel geöffnet ist, ist Tageslicht und die Helligkeit muss auf "2000" eingestellt werden. Natürlich würde das Programm in 1 bis 59 Sekunden von selbst aufwachen, aber es ist bequemer, die Helligkeit sofort einzustellen.
Ich werde den Suspend / Resume-Code veröffentlichen, nachdem er geschrieben wurde. Hoffentlich dieses Wochenende.
quelle