Screen Prozess beenden

Dieses Thema im Forum "Linux & BSD" wurde erstellt von Jango4RR, 18. April 2010 .

  1. 18. April 2010
    Hi,

    es geht um folgendes:

    Ich habe einen Prozess mit screen gestartet und ihm einen screen Namen zugewiesen,
    mit Screen -list kann man ja sehen welche Prozesse bei Screen laufen.

    Meine Frage, kann man einen Screen Prozess mit einem festen Prozessnamen via bash, also ner .sh datei beenden ? Starten geht mit ner .sh datei ohne Probleme, nur mit dem Beenden klappts nicht.

    Freue mich auf Antworten

    Gruß
     
  2. 18. April 2010
    AW: Screen Prozess beenden

    du könnest über ps die prozess id herausbekommen und dann SIGTERM signal schicken (kill befehl ohne weitere parameter).

    ps -e|grep namevomscreen
    das ganze durch awk jagen mit print($1) oder so ähnlich, dass jedenfalls am ende nur die PID übrig bleibt und die dann dem kill befehl übergeben.
     
  3. 18. April 2010
    AW: Screen Prozess beenden

    Bin ein Laie auf diesem Gebiet => Bahnhof ^^

    Aber schonmal danke für die Antwort
     
  4. 18. April 2010
    AW: Screen Prozess beenden

    ok ich versuch bissl ausführlicher zu werden.
    mit dem "kill" befehl kann man programme bestimmte signale zukommen lassen. die bekanntesten sind SIGTERM und SIGKILL. SIGTERM bekommt jdes programm, das beendet werden soll.
    wenn du z.b. deinen apache neustartest über das init.d script, dann schickt dieses script allen apache prozessen den SIGTERM befehl. das programm versteht das und versucht sich sauber zu beenden. das betriebsystem gibt dem programm die notwendige zeit dies selbständig durchzuführen.
    wenn ein programm sich nicht sauber beenden kann, muss der SIGKILL befehl her. in dem fall würgt das OS das programm schlichtweg ab; nicht gespeicherte sachen im RAM gehen verloren. ist nötig, falls ein programm nicht mehr reagiert.

    (alles was hinter dem # steht, dient als kommentar )

    Code:
    kill programmname #beende programmname
    kill -9 programmname #töte prorgrammname
    "ps" kennst ja.
    Code:
    ps -e #zeige alle prozesse
    Code:
    ps -e|grep deinscreenname #zeige aus der ausgabe aller prozesse nur die zeile, die deinscreename beinhaltet
    mit awk kann man tabellarisch zeilen bearbeiten. isn ziemlich mächtiges tool, ähnlich wie sed, aber wir brauchen hier nur eine einfache funktion.

    Code:
     echo Hallo Welt | awk '{print $1}' #ergebnis: Hallo
     echo Hallo Welt | awk '{print $2}' #Ergebnis: Welt
    
    Code:
    ps -e|grep deinscreenname | awk '{print $1}' #zeige nur die PID des prozesses deinscreename aus der liste alle prozesse
    um das in einem bashscript unterzubringen, musst du das ganze in eine variable schreiben.

    Code:
    var1=´ps -e|grep deinscreenname | awk '{print $1}'´ #der variable $var1 wird die ausgabe des nachfolgenden befehls zugewiesen
    mit echo, kannst du dan das ergebnis prüfen. echo $var1 sollte dir die PID ausgeben.

    jetzt kannst du dann im script z.b. kill $var1 benutzen.


    PS: ich hab bei dir neuen apache aufgespielt, da kam heut morgen was in der debian security mailing list
     
  5. 18. April 2010
    AW: Screen Prozess beenden

    wenn das der einzige screen-prozess ist, könntestes ja mit pidof probieren statt mit ps=)...mfg coach
     
  6. 18. April 2010
    AW: Screen Prozess beenden

    Jeh nachdem welcher prozess im screen läuft kannst du das per
    screen -r [Session-Name] -X [exit-command]
    beenden. Die werte in Klammern musst du natürlich noch anpassen. Ich habe meinen Source Server z.B. damit kontrolliert:
    screen -r srcds -X quit
     
  7. 18. April 2010
    AW: Screen Prozess beenden

    noch kurz zur weiteren erläuterung:
    -r ist der befehl für 'reattach' (um den screen wieder in den vordergrund zu holen)
    -x ist um einen befehl auf den screen auszuführen

    grz
     
  8. 18. April 2010
    AW: Screen Prozess beenden

    nach eurer Anleitung wäre dann diese Datei richtig ?

    Code:
    #!/bin/sh
    screen -r cs1 -X quit
    Und es rennen mehrere Instanzen in Screen:

    cs1
    cs2
    cs3

    Wenn ich allerdings meine Datei.sh ausführe bekomme ich FOlgende Meldung:
    Code:
    There are several suitable screens on:
     5951.cs3 (04/18/2010 07:52:27 PM) (Detached)
     5949.cs2 (04/18/2010 07:52:27 PM) (Detached)
     5946.cs1 (04/18/2010 07:52:27 PM) (Detached)
    Use -S to specify a session.
    
    
     
  9. 18. April 2010
    AW: Screen Prozess beenden

    da musst die session spezifizieren. in dem fall

    #!/bin/sh
    screen -r 5946.cs1 -X quit
     
  10. 18. April 2010
    AW: Screen Prozess beenden

    für die screen bezeichnung kannst du jeweils die nummer only nehmen
    eg:

    Code:
    #!/bin/sh
    screen -r 5951 -X quit
     
  11. 18. April 2010
    AW: Screen Prozess beenden

    Ja ich kanns auch via kill nummer machen.

    Ich will aber, dass ich das nur mit einer datei killen kann, d.h. auch im Prinzip als Webinterface zum stoppen / restarten.
     
  12. 18. April 2010
    AW: Screen Prozess beenden

    dann musst halt vorher ne abfrage nach der PID machen

    Code:
    var1=´ps -e|grep cs1 | awk '{print $1}'´
    screen -r $var1.cs1 -X quit
     
  13. 18. April 2010
    AW: Screen Prozess beenden

    ich denke was du suchst ist ca das hier http://www.zuglufttier.de/dokuwiki/doku.php/user/nicer/gamesrv
    musste halt noch an deine bedürfnisse anpassen aber denke das wird nicht allzu schwer sein.
    greetz
     
  14. 18. April 2010
    AW: Screen Prozess beenden

    Mag mir da jemand beim Anpassen helfen ?
    GGL is klar^^
     
  15. 18. April 2010
    AW: Screen Prozess beenden

    Hier mal mein Script
    Verwendung ohne jede Garantie.
    Ist ein wenig unkomplizierter, da meine Bash Kenntnisse nicht so gut sind. Bin mir sicher ist verbesserungswürdig, aber dennoch funktionsfähig.
    Der Update Part wurde nie fertig gestellt.
    Code:
    #!/bin/bash
    #variables
    DAEMON=srcds_run
    PARMS="-maxplayers 16 -game sourceforts +map sf_skywalk.bsp"
    NAME=srcds
    STEAM=steam
    UPDATE="-command update -game hl2mp -dir /home/srcds"
    UPDATEMSG="Server is going down for maintain."
    KILLMSG="Server is going down."
    RESTARTMSG="Server is restarting."
    
    #Code
    
    start() {
    if [[ `screen -ls | grep $NAME` ]] ; then
     echo "Server läuft schon!"
    else
     ps aux > tmp
     if [ `grep -i steam tmp` ] ; then
     echo "Ein Update läuft gerade!"
     else
     screen -d -m -S $NAME ./$DAEMON $PARMS
     echo "Server gestartet!"
     fi
     rm tmp
    fi
    }
    
    stop() {
    if [[ `screen -ls | grep $NAME` ]] ; then
     sendmsg "$1"
     sleep 0.2
     screen -r $NAME -X quit
     echo "Server beendet!"
    else
     echo "Server läuft nicht!"
    fi
    }
    
    status() {
    if [[ `screen -ls | grep $NAME` ]] ; then
     echo "Server läuft gerade!"
    else
     ps aux > tmp
     if [ `grep -i steam tmp` ] ; then
     echo "Ein Update läuft gerade!"
     else
     echo "Weder Server noch Update aktiv!"
     fi
     rm tmp
    fi
    
    }
    sendmsg() {
    if [[ `screen -ls | grep $NAME` ]] ; then
     if [ "$1" = "" ] ; then
     echo "Keine Nachricht angegeben!"
     else
     screen -S $NAME -p 0 -X stuff "say $1"
     screen -S $NAME -p 0 -X eval 'stuff \015'
     fi
    else
     echo "Server läuft nicht!"
    fi
    }
    
    #$COMMAND check
    case "$1" in
     start)
     start
     ;;
     stop)
     stop "$KILLMSG"
     ;;
     restart)
     stop "$RESTARTMSG"
     start
     ;;
     status)
     status
     ;;
     sendmsg)
     sendmsg "$2"
     ;;
     *)
     echo "Commands: start; stop; restart; sendmsg [msg]; update; status"
     ;;
    esac
    
    exit 0
     
  16. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.