Disown / background einen Befehl in bash übergeben
670
Stephen Smith
TL; DR unten.
Ich versuche, einen einfachen Sperrbildschirm für meinen Laptop mit Arch / BSPWM zu erstellen. Ich habe ein Programm namens cmatrix gefunden, das über ein Screensaver-Flag verfügt, das bewirkt, dass es beendet wird, wenn eine Taste gedrückt wird. Ich versuche, bspc-Befehle mit cmatrix und vlock zu verketten, um eine Zeile zu erstellen, die gestartet werden kann, um cmatrix im Vollbildmodus zu starten, vlock auszuführen, wenn Tasten gedrückt werden, und dann zu beenden, nachdem vlock beendet wurde.
Mein einziges Problem dabei ist, dass der Sxhkd beendet werden muss, damit der Sperrbildschirm wirksam wird, damit die Benutzer das Fenster, das cmatrix / vlock enthält, nicht einfach schließen. Ich habe pkill sxhkd zur Befehlskette hinzugefügt und das funktioniert. Der defekte Teil startet sxhkd wieder. Das Anbringen von sxhkd an das Ende funktioniert nicht, da das Terminalfenster erst geschlossen wird, wenn sxhkd beendet ist. Dies ist niemals der Fall. Wenn das Terminalfenster geschlossen ist, wird sxhkd außerdem angehalten, da es in diesem Fenster ausgeführt wurde.
Ich habe versucht, "sxhkd &" zu verwenden, aber aus irgendeinem Grund führt dies dazu, dass das Ganze nicht läuft.
Hier ist der fast funktionierende Befehl, den ich bis jetzt habe:
Die Schlafbefehle sind so, dass die Programme nicht in der falschen Reihenfolge angezeigt werden (manchmal erscheint die Eingabeaufforderung für das vlock-Kennwort, bevor cmatrix ausgeführt werden kann).
Derzeit wird ein neues urxvt-Fenster gestartet (wichtig, wenn ich meine Terminal-Schriftart für cmatrix verwenden möchte), und sxhkd wird beendet, um zu verhindern, dass jemand das Fenster schließt. Es zeigt es mit bspc an und führt cmatrix aus. Wenn eine Taste gedrückt wird, wird die Cmatrix verlassen und es erscheint die Aufforderung zur Eingabe des vlock-Passworts. Wenn das Kennwort richtig eingegeben wurde, wird versucht, sxhkd neu zu starten, die Verbindung bleibt jedoch bestehen.
Jede Hilfe wäre sehr dankbar!
TL; DR
Wie kann ich mit einem Befehl (der normalerweise von einem Skript aus ausgeführt wird) ein Terminalfenster öffnen, das andere Befehle ausführt, dann eine Anwendung startet (wie eine Gui-App), das Terminalfenster geschlossen wird, die Gui-App jedoch weiterhin ausgeführt wird?
Einfachere Befehlsbeispiele :
urxvtc -e bash -c "echo hello!; sleep 3; pavucontrol" Dies sollte Hallo drucken !, warten Sie 3 Sekunden, starten Sie pavucontrol und schließen Sie das Terminal, wobei pavucontrol verlassen wird. Stattdessen bleibt das Terminal geöffnet, da Pavucontrol läuft.
urxvtc -e bash -c "echo hello!; sleep 3; pavucontrol &" Dies sollte Hallo drucken !, warten Sie 3 Sekunden, starten Sie pavucontrol und schließen Sie das Terminal, wobei pavucontrol verlassen wird. Wenn das Terminal nach 3 Sekunden schließt, ist die Pavucontrol nirgends zu sehen.
2 Antworten auf die Frage
1
Stephen Smith
Ich scheine über die Lösung gestolpert zu sein, wenn ich mit nohup alleine spiele. Es scheint, dass nohup den Job nicht vollständig vom Terminal freigibt, sodass das Laufen nohup program & exitnicht funktioniert - das Terminal beschwert sich darüber, dass Jobs ausgeführt werden. Die einfache Lösung besteht darin, zwischen ihnen einen weiteren Schlaf hinzuzufügen:
nohup command & sleep 2 && exit
Der Schlaf kann möglicherweise etwas verkürzt werden, aber wenn er zu kurz ist, wird das nicht unterstützte Programm wahrscheinlich geschlossen.
Edit: Ich habe ein inkonsistentes Verhalten mit nohup und exit - manchmal wird es beendet und das Programm läuft, und manchmal wird es sich beschweren, dass es Jobs gibt. Ich bin nicht sicher, warum es passiert.
0
l0b0
Zum Starten und Verwaisen eines Hintergrundprozesses verwenden Sie nohup my_command &. Danach können Sie exitdie Startschale ohne den neuen Prozess zu töten. Mehr zum Prozessmanagement.
Mit den einfacheren Testbefehlen versuchte ich, nohup pavucontrol & am Ende hinzuzufügen, was zu "urxvtc -e bash -c" echo hallo !; sleep 3; nohup pavucontrol & quot; "führte. Leider führt der gesamte Befehl dazu, nichts zu tun. Es scheint, das Terminalfenster zu öffnen, das sich sofort schließt, ohne dass der Schlaf unterbrochen wird. 3.
Stephen Smith vor 9 Jahren
0
Sie können sowohl `&` * als auch * `;` nicht verwenden, um einen Befehl zu beenden.
l0b0 vor 9 Jahren
0
Mein Fehler. Es scheint das Echo zu laufen und zu schlafen, aber Pavucontrol ist nirgends zu sehen. `urxvtc -e bash -c" hallo hallo !; schlaf 3; nohup pavucontrol & "`
Stephen Smith vor 9 Jahren
0