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.

Antworten:


114

Das ist ganz einfach:

screen -d -m yourcommand

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 .


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      

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'

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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.