töte einen Bildschirm (aber nicht alle Bildschirme)

19

Auf einem Ubuntu-Server werden mehrere Bildschirme ausgeführt, die wie folgt initiiert werden:

screen -dmS screen1 cmd
screen -dmS screen2 cmd
etc...

Und ich muss einen Bildschirm abbrechen, aber nicht alle. Was ist der richtige Befehl, um einen bestimmten Bildschirm mit seinem Namen zu beenden? Ich habe die Manpages durchgelesen, aber ich kann den gesuchten Befehl nicht finden.

Außerdem möchte ich diesen Befehl in ein Bash-Skript schreiben, damit ich nicht einfach + screen -r screen1drücken kann, wie ich es normalerweise tun würde.CtrlX

BassKozz
quelle
Tut mir leid, dachte, das wäre für eine Sekunde über Donkey Kong
Chopper3
Ich liebe dieses T-Shirt ohgizmo.com/wp-content/uploads/2008/11/…
Chopper3
Das ist ein schönes T-Stück, die meisten Leute werden es nicht
verstehen
Das richtige Wort für ein Objekt einer Phrase ist "dich".
Bis auf weiteres angehalten.
3
Sie sagten "Hol es dir" hier und "Danke dir" unten. Es sollte "hol es dir" und "Danke dir" sein.
Bis auf weiteres angehalten.

Antworten:

19

Von der Manpage:

   -X   Send the specified command to a running screen  session.  You  can
        use  the  -d or -r option to tell screen to look only for attached
        or detached screen sessions. Note that this command  doesn't  work
        if the session is password protected.

Du kannst tun :

        screen -X -S <sessionid> kill
François Feugeas
quelle
PERFEKT!!! Danke, auf jeden Fall, das hat Musta bei dem Mann verpasst.
BassKozz
Gut zu wissen :-)
ℝaphink
9

Wenn Sie eine machen screen -list, werden Sie feststellen, dass jeder Bildschirmname mit einer Zahl beginnt, die die PID des Bildschirms ist:

 $ screen -list
There are screens on:
        12281.pts-1.jonah       (12/21/2009 07:53:19 PM)        (Attached)
        10455.pts-1.jonah       (12/19/2009 10:55:25 AM)        (Detached)
2 Sockets in /var/run/screen/S-raphink.

Von dort senden Sie einfach ein KILL-Signal an diese spezifische PID:

$ kill 12281

und es wird den spezifischen Bildschirm abbrechen.

ℝaphink
quelle
Das funktioniert nicht, weil ich es von einem Bash-Skript aus starte und die PID nicht aus der Bildschirmliste ziehen muss, die dem richtigen Bildschirm entspricht. Danke dir.
BassKozz
Ok, gut, dass defraagh eine perfekte Lösung dafür hatte.
ℝaphink
1

Die Lösung von defraagh funktioniert bei mir nicht, aber ich kann die Bildschirmsitzung mit Raphinks Idee beenden:

screen -list liefert die Prozess ID

kill -9 PROCESSID

Bildschirm-wischen SESSIONID

garconcn
quelle
1

Wenn Sie mehrere Bildschirme mit demselben Namen haben, können Sie diese gleichzeitig beenden:

screen -ls  | egrep "^\s*[0-9]+.ScreenName" | awk -F "." '{print $1}' | xargs kill
  • Befehl screen -lsdruckt Bildschirme mit ihrer Prozessnummer. Beispiel: 4773.test ist ein Bildschirm mit der Prozessnummer 4773 und dem Namen test . Beispielausgabe:

    6322.ss      (05/23/2018 10:39:08 AM)        (Detached)
    6305.sc  (05/23/2018 10:38:40 AM)        (Detached)
    6265.ScreenName       (05/23/2018 10:37:59 AM)        (Detached)
    6249.ScreenName  (05/23/2018 10:37:50 AM)        (Detached)
    6236.scc        (05/23/2018 10:37:42 AM)        (Detached)
  • Befehlsfilter egrepüber dem Beispieltext, der über eine Pipe-Leitung gesendet wird | .

  • Befehl awk -F "." '{print $1}'extrahiert die erste Spalte jeder Zeile. Das Trennzeichen zwischen den Spalten wird durch die Option -F als Punkt (.) Definiert
  • Der Befehl xargs killfinally bricht alle Prozesse ab, deren Nummern über pipe | gesendet wurden. xargswird verwendet, wenn für jeden Eingang ein Befehl ausgeführt werden soll.
Mohsen Abasi
quelle
0

Sie öffnen ein neues Fenster mit

Ctrl A + C

Sie schließen ein Fenster mit

Ctrl + D

oder Befehl innerhalb des Fensters beenden

Thomas Webber
quelle
0

Ich habe damit wie folgt umgegangen:

process=$(screen -ls | grep screen1)
kill $(echo $process | cut -f1 -d'.')
exit

Die Erklärung ist, dass Sie die Ausgabe von nehmen screen -lsund den bestimmten Bildschirm finden, an dem Sie interessiert sind, indem Sie grep verwenden und dann diese Zeichenfolge der Variablen zuweisen process.

Da die Ausgabe von screen -lsimmer die PID gefolgt von einer Periode ist, können Sie cut verwenden, um die Periode und alles, was danach folgt, zu entfernen. Im obigen Beispiel setzen wir das in Klammern und geben es an den Befehl kill weiter, obwohl Sie es auch linear ausführen können, was das Schreiben in eine temporäre Datei und das Auslesen daraus beinhalten könnte.

Sie müssen sicherstellen, dass Ihr Bildschirmname eindeutig ist und dass grep NUR den Namen des Bildschirms zurückgibt, den Sie beenden möchten.

unifex
quelle