Wie führe ich einen Befehl auf dem Bildschirm aus und löse ihn?

75

Wie kann ich den Bildschirm dazu bringen, einen Befehl auszuführen und dann zu trennen (dh automatisch in einem einzelnen Skript ohne weitere Eingabe, nachdem das Skript anfänglich gestartet wurde)? Ich starte zB myscript.sh und es startet automatisch eine Bildschirmsitzung, führt einen Befehl aus und trennt sich dann.

Darkfeline
quelle

Antworten:

114

Das ist ganz einfach:

screen -d -m yourcommand
Alan Curry
quelle
4
kein Würfel. screen -d -m befehl, screen -list sagt no sockets, screen -r no sessions
darkfeline
1
Irgendwie wurde Ihr Befehl in der automatisch erstellten Bildschirmumgebung nicht gefunden oder funktioniert nicht richtig. Versuche einfach screen yourcommandauf das -dund zu verzichten -mund schau, wie das zuerst geht.
Alan Curry
Du hast irgendwie recht. Der Bildschirm wird entgegen meinen Erwartungen beendet, wenn der Befehl beendet wird. Aber Ihre Antwort funktioniert.
Darkfeline
3
Sie können dies ändern, indem Sie die zombieOption auf dem Bildschirm aktivieren . Setzen Sie zombie xyin Ihre ~/.screenrc. Es sollte auch möglich sein, es nur für eine Sitzung zu aktivieren, indem Sie eine zombie xyandere Datei einfügen und verwenden, -c fileaber aus irgendeinem Grund funktioniert das nicht, wenn ich es versuche. Oder verwenden Sie einfachsh -c 'yourcommand;while :;do sleep 9999; done'
Alan Curry
@ AlanCurry, Nö, das funktioniert auch bei mir nicht, obwohl der Befehl perfekt ausgeführt wird (und mehrere Stunden dauert), wenn er manuell auf einem Bildschirm ausgeführt wird.
Cerin
47

Um einen einzelnen Befehl auf dem Bildschirm auszuführen und die Verbindung zu trennen, können Sie versuchen:

screen -dm sleep 10

Versuchen Sie Folgendes, um mehrere Befehle auszuführen:

screen -dm bash -c "sleep 10; myscript.sh"

Bitte beachten Sie, dass beim Beenden eines Programms der Bildschirm (standardmäßig) das Fenster schließt, in dem sich das Programm befindet.

Wenn Sie nicht möchten, dass Ihre Sitzung nach Abschluss des Skripts beendet wird, fügen Sie exec sham Ende Folgendes hinzu:

screen -dm bash -c 'sleep 5; exec sh'

Um alle Ihre Sitzungen aufzulisten, versuchen Sie:

screen -list

Verwandte Themen: Unix-Bildschirm starten, Befehl ausführen, Trennen .

Kenorb
quelle
2
Das hat bei mir unter Ubuntu 16.04 geklappt. Neben Ihrer Sitzung zu nennen , so dass Sie später darauf zurückkommen können, hinzufügen -S sessionname: screen -dmS MyLongRunningScript bash -c "...".
Dan Dascalescu
16

Um eine neue Sitzung im Hintergrund mit dem Namen 'schläfrig' zu starten

screen -S sleepy -dm sleep 60

Um "schläfrige" Sitzung zu töten

screen -S sleepy -X quit      
Michal Zmuda
quelle
warum es nicht wie arbeiten screen -S sleepy -dm "cd myfolder;sleep 60"?
Toolkit
@ Toolkit Das Problem ist, dass der Befehl in Anführungszeichen steht und daher als ein großer Befehl behandelt wurde. Offensichtlich können wir es aufgrund des Semikolons nicht aus Anführungszeichen entfernen. Um dies zu lösen, führen Sie den Befehl folgendermaßen aus: screen -S sleepy -dm bash -c "cd myfolder; sleep 60"
Jason Thompson
3
screen -dmS screen_session_name bash -c 'echo "doing stuff"; exec bash'
tkjef
quelle
0

Das passiert mir, wenn ich die Taste c (sig int) drücke, um mein Programm zu verlassen. es tritt den ganzen Weg von allen Bash aus. Also fand ich das, um SIGINT zu fangen. und verhindern, dass die letzte Bash beendet wird. (muss zum Beenden exit eingeben)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

Ich finde es nützlich, Cron zu verwenden, um NodeJS-Programme beim Start auszuführen. und um den Bildschirm beim Booten zu starten. in cron gibt es spezielle events syntax @reboot event

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
Shimon Doodkin
quelle