Bestimmten screen beenden?

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
Benutzeravatar
gnatbite
Beiträge: 81
Registriert: 30.10.2003 20:04:20
Wohnort: Dortmund & Xanten
Kontaktdaten:

Bestimmten screen beenden?

Beitrag von gnatbite » 10.02.2006 14:28:54

Hallo Leute, ich habe mal ne Frage zu screen.

Wenn ich mit

Code: Alles auswählen

screen -S meinScreen
einen screen erstelle, wird für den der angegebene name vergeben. In diesem fall "meinScreen".

Wenn ich nun mehrere screen laufen habe, würde ich gerne einen bestimmten screen beenden lassen. Das Ganze soll aber automatisiert passieren, also OHNE einen Wechsel in den jeweiligen screen.
In der manpage steht, dass man mit -X einen Befehl übergeben kann, ich habe es bisher aber leider nicht hinbekommen.

Folgendes Beispiel-Szenario:

Code: Alles auswählen

There are screens on:
        5967.eins       (Detached)
        5970.zwei       (Detached)
2 Sockets in /var/run/screen/S-root.
Jetzt würde ich gerne NUR screen-eins beenden.
Ich möchte den Screen aber ohne kill oder killall zu benutzen beenden. Über die pid wäre es zwar trivial aber die pid ändert sich ja bei jedem neu aufgemachten screen, deshalb muß ich den screen irgendwie über vergebenen namen beenden.

Kann man vielleicht irgendwie ein exit an einen bestimmten screen übergeben?
Man lernt eine Sache nur, indem man sich an ihr versucht, nicht indem man über sie nachdenkt.

chrissla
Beiträge: 69
Registriert: 07.05.2004 08:19:51

Beitrag von chrissla » 10.02.2006 15:05:35

versuch mal

Code: Alles auswählen

screen -i $name 

-i   will  cause  the interrupt key (usually C-c) to interrupt the display immediately when flow-control is on.  See the "defflow" .screenrc command for details.  The use of this option is discouraged.

Ansonsten kannst du es damit versuchen:

-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.
chrissla

ps:

Code: Alles auswählen

man screen
ist dein Freund ;)

Benutzeravatar
gnatbite
Beiträge: 81
Registriert: 30.10.2003 20:04:20
Wohnort: Dortmund & Xanten
Kontaktdaten:

Beitrag von gnatbite » 10.02.2006 15:23:04

-i geht nicht.

-X habe ich ja bereits versucht und zwar wie folgt.

Code: Alles auswählen

 screen -r test -X exit
Funzt aber leider auch nicht oder mache ich etwas falsch?
Man lernt eine Sache nur, indem man sich an ihr versucht, nicht indem man über sie nachdenkt.

chrissla
Beiträge: 69
Registriert: 07.05.2004 08:19:51

Beitrag von chrissla » 10.02.2006 15:35:05

der screen aus deinem beispiel war ja schon detached, dann musst du also -d nehmen.
ich weiss nich genau, welche befehle erlaubt sind, aber versuch mal "kill" statt "exit"

chrissla

Benutzeravatar
gnatbite
Beiträge: 81
Registriert: 30.10.2003 20:04:20
Wohnort: Dortmund & Xanten
Kontaktdaten:

Beitrag von gnatbite » 10.02.2006 15:41:26

Ich habe schon so einige probiert. Kill macht keinen Sinn, da der Befehl zum Beenden des Screens exit ist.

-d detached den Screen, macht in diesem Kontext also ebenfalls keinen Sinn.

Das muß doch irgendwie möglich sein!?
Zuletzt geändert von gnatbite am 11.02.2006 12:37:19, insgesamt 1-mal geändert.
Man lernt eine Sache nur, indem man sich an ihr versucht, nicht indem man über sie nachdenkt.

chrissla
Beiträge: 69
Registriert: 07.05.2004 08:19:51

Beitrag von chrissla » 10.02.2006 15:50:44

vielleicht so:

command [-c class]

This command has the same effect as typing the screen escape character (^A). It is probably only useful for key bindings. If the "-c" option is given, select the specified command class. See also "bind" and "bindkey".

mehr fällt mir dazu dann auch nicht mehr ein

DeletedUserReAsG

Beitrag von DeletedUserReAsG » 10.02.2006 17:05:01

Zumindest bei mir funktioniert es mit 'screen name -X exit'

cu

alchemist
Beiträge: 4
Registriert: 09.02.2006 19:59:50

Beitrag von alchemist » 10.02.2006 17:57:08

mhh ... bei mir klappt das auch nicht. ich mach das dann immer so, dass ich gucke welche PID der screen hat, den ich beenden will und dann "kill" ich ihn ...

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 10.02.2006 18:05:26

Genau so mache ich das auch immer.

Ich schaue mir die Screens mit screen -ls an und hole mit dann den entsprechenden Screen mit screen -r <PID> oder beende den Screen mit kill <PID>.
Oh, yeah!

Benutzeravatar
gnatbite
Beiträge: 81
Registriert: 30.10.2003 20:04:20
Wohnort: Dortmund & Xanten
Kontaktdaten:

Beitrag von gnatbite » 10.02.2006 18:24:56

mhh ... bei mir klappt das auch nicht. ich mach das dann immer so, dass ich gucke welche PID der screen hat, den ich beenden will und dann "kill" ich ihn ...
Ja, das geht aber leider ist es für meinen Fall keine Lösung.

Mein screen wird von einem cronjob gestartet und soll auch wieder von einem beendet werden. Die PID ändert sich natürlich bei jedem Start des screen, also kann ich den screen auch nicht per cronjob beenden lassen, außer natürlich permanent den cronjob zu ändern aber das wäre nicht im Sinne des Erfinders.

Vielleicht kommt ich mit grep weiter. Wie kann ich mit grep bestimmte Zeichen aus einer Zeile auslesen? z.b. das 2te bis 6te
Man lernt eine Sache nur, indem man sich an ihr versucht, nicht indem man über sie nachdenkt.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 10.02.2006 18:28:51

Wenn du den Screens einen Namen gibts und dann in deinem Script die Ausgabe von screen -ls verarbeitest, kannst du doch die Screens anhand des Namens bestimmen.

Dann die PID abschneiden und in einer Variablen speichern und diese dann mit kill beenden.

Könnte doch funktionieren, oder?
Oh, yeah!

Benutzeravatar
gnatbite
Beiträge: 81
Registriert: 30.10.2003 20:04:20
Wohnort: Dortmund & Xanten
Kontaktdaten:

Beitrag von gnatbite » 10.02.2006 18:31:52

Dann die PID abschneiden und in einer Variablen speichern und diese dann mit kill beenden.
Ja daran habe ich auch schon gedacht aber leider weiß ich nicht wie ich die PID rausschneide.!? Bestimmt mit grep aber wie?[/quote]
Man lernt eine Sache nur, indem man sich an ihr versucht, nicht indem man über sie nachdenkt.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 10.02.2006 18:38:18

Dachte da vielleicht eher an awk oder so.

Beispiel:
FILE=5967.eins
PID=`cat $FILE | awk -F"." '{print $1}'`
echo $PID
Das sollte dir zum Beispiel die PID in einem String wiedergeben.
Oh, yeah!

Benutzeravatar
gnatbite
Beiträge: 81
Registriert: 30.10.2003 20:04:20
Wohnort: Dortmund & Xanten
Kontaktdaten:

Beitrag von gnatbite » 10.02.2006 18:56:19

Hmmm. das verstehe ich nicht.

Was macht denn die erste Zeile? Wenn ich wieder pid und name vorher angeben muß, dann macht das doch wieder keinen Sinn oder verstehe ich da jetzt etwas gar nicht!?
Man lernt eine Sache nur, indem man sich an ihr versucht, nicht indem man über sie nachdenkt.

Benutzeravatar
gnatbite
Beiträge: 81
Registriert: 30.10.2003 20:04:20
Wohnort: Dortmund & Xanten
Kontaktdaten:

Beitrag von gnatbite » 10.02.2006 19:46:13

So, habe es jmit cut hinbekommen. Folgendes bash-skript tut alles was ich brauche. :-)

Code: Alles auswählen

#!/bin/bash
kpid=`screen -ls | grep NameDesZuKillendenScreen | cut -c 2-5`
kill $kpid
 
Man lernt eine Sache nur, indem man sich an ihr versucht, nicht indem man über sie nachdenkt.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 11.02.2006 12:30:44

Oder so.

Das sieht doch super aus. Ein kurzes und übersichtliches Script, was seinen Zweck erfüllt.
Oh, yeah!

Benutzeravatar
gnatbite
Beiträge: 81
Registriert: 30.10.2003 20:04:20
Wohnort: Dortmund & Xanten
Kontaktdaten:

Beitrag von gnatbite » 14.02.2006 19:45:04

Noch ein kleiner Nachtrag von mir. In meinem Skript war ein Denkfehler. Natürlich kann es vorkommen, dass die PID auch mal 5stellig wird. In diesem Fall würde es nicht funktionieren.

Habe es leicht modifiziert.

Code: Alles auswählen

#!/bin/bash
torrentpid=`screen -ls | grep torrent | cut -d'.' -f1`
kill $torrentpid
Man lernt eine Sache nur, indem man sich an ihr versucht, nicht indem man über sie nachdenkt.

bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bRun0 » 31.08.2006 00:14:07

sooo

hab das thema über die suche gefunden weil ich "eigentlich" nur nen befehl gesucht hab wie ich von nem bestimmten prozess die PID rausfinden kann ;) (und anschliesend killen^^)

hab dann aber beim lesen gesehen das du was suchst, was ich vor laaaanger zeit auch mal gesucht hab, speziel um in eine detached screen session das spezielle commando exit zu senden :-)


fals nochmal jemand auf das thema stöst, oder der thread ersteller gar noch die mail funktion an hat

hier die lösung

Code: Alles auswählen

#!/bin/bash
screen -S SCREENNAME -p 0 -X stuff "exit`echo -e '\r'`"
die ganzen sonderzeichen und der spielkram sind enorm wichtig und ich benutz das schon ewig so

es lassen sich so alle möglichen sachen in die aktive screensession schicken :-)

mfg

Benutzeravatar
Teddybear
Beiträge: 3163
Registriert: 07.05.2005 13:52:55
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Altomünster
Kontaktdaten:

Beitrag von Teddybear » 31.08.2006 15:28:02

Moin

Also mal ein kleines Script zum Starten und Beenden von Diensten/Programmen in einem Screen:

Code: Alles auswählen

#!/bin/sh
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
#
DIR=/VERZEICHNIS/IN/DEM/DIE/DATEI/LIEGT
#
DAEMON=$DIR/AUSFÜHRBAREDATEI ODER SCRIPT
#
PARAMS=" HIER KOMMEN DIE PARAMETER REIN DIE DEM PROGRAMM MIT GEGEBEN WERDEN "
#
NAME=NAME FÜR DEN SCREEN
DESC="BESCHREIBUNG"
#
case "$1" in
 start)
   echo "Starting $DESC: $NAME"
   if [ -e $DIR ];
   then
    cd $DIR
    screen -d -m -S $NAME $DAEMON $PARAMS
   else echo "No such directory: $DIR!"
   fi
   ;;
#
 stop)
   if [[ `screen -ls |grep $NAME` ]]
   then
       echo -n "Stopping $DESC: $NAME"
       kill `screen -ls |grep $NAME |awk -F . '{print $1}'|awk '{print $1}'`
       echo " ... done."
   else
       echo "Coulnd't find a running $DESC"
   fi
   ;;
#
 restart)
   if [[ `screen -ls |grep $NAME` ]]
   then
       echo -n "Stopping $DESC: $NAME"
       kill `screen -ls |grep $NAME |awk -F . '{print $1}'|awk '{print $1}'`
       echo " ... done."
   else
       echo "Coulnd't find a running $DESC"
   fi
   
   echo -n "Starting $DESC: $NAME"
   cd $DIR
   screen -d -m -S $NAME $DAEMON $PARAMS
   echo " ... done."
   ;;
 #
 status)
   ps aux | grep -v grep | grep $DAEMON > /dev/null
   CHECK=$?
   [ $CHECK -eq 0 ] && echo "Server läuft" || echo "Server ist down"
   ;; 
 #
 *)
   echo "Usage: $0 {start|stop|status|restart}"
   exit 1
   ;;
esac

exit 0
Viel SPASS damit..

Greetz Sascha
Versuchungen sollte man nachgeben. Wer weiß, ob sie wiederkommen!
Oscar Wilde

Mod-Voice / My Voice

Antworten