kostenloser Webspace werbefrei: lima-city


Linux: Überprüfen ob ein Screen läuft

lima-cityForumProgrammiersprachenSonstige Programmiersprachen

  1. Autor dieses Themas

    pc-freak8806

    Kostenloser Webspace von pc-freak8806

    pc-freak8806 hat kostenlosen Webspace.

    Ich habe ein Programm das in verschiedenen durchnummerierten Screen gestartet wird.
    Jetzt möchte ich gerne überprüfen, ob dieser Screen noch am laufen ist, oder das Programm selber, nur leider besteht das Problem, dass jeder Screen das selbe Binary aufruft und jeweils auf einer eigenen CPU läuft, um diese zu beschäftigen.

    Ich würde mich über eine Antwort sehr freuen, da ich einfach keine Lösung weiß.

    MfG Pc-Freak8806
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Du kannst jeder Screen session einen festen Namen geben und dir auch alle Sessions auflisten lassen (genaueres entnimmst du der Doku). Dann musst du nur noch diese Liste nach den für dich interessanten Sessions durchgreppen.
  4. Autor dieses Themas

    pc-freak8806

    Kostenloser Webspace von pc-freak8806

    pc-freak8806 hat kostenlosen Webspace.

    @bladehunter: Ja, nur wie bekomme ich es hin, wenn ich bereits einen Screnn am laufen habe, ihm die PID auszulesen und das Script sagen zu lassen, dass dieser schon läuft?

    Als Hilfe meine Funktionen
    #!/bin/bash
    
    function startIdler() {
    	taskset -c ${1} screen -dmS idler$[${1}+1] nice -n +19 ./idler
    }
    
    function stopIdler() {
    	screen -r idler$[${1}+1] -X quit
    }


    Ich möchte verhindern, dass er den Idler noch einmal startet. Dafür habe ich die Screen Methode bevorzugt, wenn Ihr was besseres wisst, bin ich offen dafür.

    Pc-Freak8806
  5. Hallo pc-freak8806,

    wenn ich es richtig verstanden habe, dann geht es darum, dass Du auf jeder CPU genau einen Prozess haben willst. Die Screens sind eigentlich egal.
    Von daher würde ich einfach in einer Datei speichern, welcher Prozess auf welcher CPU läuft.
    Ich gehe davon aus, dass ${1} die ID/Nummer der CPU ist und keine Leerzeichen enthält.
    #!/bin/bash
    
    function startIdler() {
        PID=`grep " ${1}$" idler.pids | awk '{print $1}'`
        if [ "x$PID" = "x" ]
        then
            ./idler
            PID=$$
            taskset -c ${1} -p $PID
            renice -n +19 $PID
            echo $PID ${1} >> idler.pids
        fi
    }
    
    function stopIdler() {
        PID=`grep " ${1}$" idler.pids | awk '{print $1}'`
        if [ "x$PID" != "x" ]
        then
            kill $PID
            sed -i "/$PID/d" idler.pids
        fi
    }
    
    function isIdlerRunning() {
        PID=`grep " ${1}$" idler.pids | awk '{print $1}'`
        if [ "x$PID" != "x" ]
        then
            RUNNING=`ps -ef | grep "^$PID " | awk '{print $1}'`
            if [ "x$RUNNING" = "x" ]
            then
                sed -i "/$PID/d" idler.pids
                return 0
            else
                return 1
            fi
        else
            return 0
        fi
    }
    
    touch idler.pids
    
    isIdlerRunning 0
    echo $?
    
    startIdler 0
    isIdlerRunning 0
    echo $?
    
    stopIdler 0
    isIdlerRunning 0
    echo $?


    Beitrag zuletzt geändert: 5.3.2011 0:20:26 von darkpandemic
  6. Autor dieses Themas

    pc-freak8806

    Kostenloser Webspace von pc-freak8806

    pc-freak8806 hat kostenlosen Webspace.

    Hey,

    viel dank dafür. Allerdings gibt es nur noch ein Problem, undzwar wenn der Idler läuft, dann läuft er
    int main() { while(1); }


    Ein einfaches im Hintergrund ausführen, reicht nicht. Was nun?

    Anhang (Das gesamt bisherige Script)
    #!/bin/bash
    
    ALL=( 0 1 2 3 4 5 6 7 )
    
    function startIdler() {
        PID=`grep " ${1}$" idler.pids | awk '{print $1}'`
        if [ "x$PID" = "x" ]
        then
            ./idler &
            PID=$$
            taskset -c ${1} -p $PID
            renice -n +19 $PID
            echo $PID ${1} >> idler.pids
        fi
    }
    
    function stopIdler() {
        PID=`grep " ${1}$" idler.pids | awk '{print $1}'`
        if [ "x$PID" != "x" ]
        then
            kill $PID
            sed -i "/$PID/d" idler.pids
        fi
    }
    
    function checkIdler() {
        PID=`grep " ${1}$" idler.pids | awk '{print $1}'`
        if [ "x$PID" != "x" ]
        then
            RUNNING=`ps -ef | grep "^$PID " | awk '{print $1}'`
            if [ "x$RUNNING" = "x" ]
            then
                sed -i "/$PID/d" idler.pids
                return 0
            else
                return 1
            fi
        else
            return 0
        fi
    }
    
    touch idler.pids
    
    case "$1" in
    	start)
    		case "$2" in
    			[0-9]*)
    				startIdler $2
    			;;
    			
    			*)
    			  for KERN in $ALL
    			  do
    				startIdler $KERN
    			  done
    			;;
    		esac
    	;;
    	
    	stop)
    		case "$2" in
    			[0-9]*)
    				stopIdler $2
    			;;
    			
    			*)
    				for KERN in $ALL
    				  do
    					stopIdler $KERN
    				  done
    			;;
    		esac
    	;;
    
    	status)
    		case "$2" in
    			[0-9]*)
    				checkIdler $2
    			;;
    			
    			*)
    				for KERN in $ALL
    				  do
    					checkIdler $KERN
    				  done
    			;;
    		esac
    	;;
    	
    	*)
    		echo "Syntax ${0} [start|stop|status] ([1-8])"
    	exit 1
       ;;
    esac
    
    exit 0
  7. Hallo pc-freak8806,

    ich muss nochmal nachfragen, wo das Problem ist, weil ich mir unter 'wenn er läuft, dann läuft er' nicht so viel vorstellen kann.
    Den C-Code verstehe ich schon. Das Programm soll laufen, bis es gekillt wird.
    Von daher:
    - Macht das Skript nach './idler &' nicht weiter?
    mögliche Lösung: ???

    - Wird der idler beendet, wenn das Skript beendet wird?
    mögliche Lösung:
    nohup ./idler &
    PID=$!


    - Wird der idler durch das kill-Kommando nicht beendet?
    mögliche Lösung:
    kill -s 9 $PID


    Edit:
    Habe gesehen, dass da noch ein kleiner Fehler bei den sed Befehlen ist. Der muss jeweils wie folgt sein:
    sed -i "/^$PID /d" idler.pids

    Nicht, dass wir aus versehen falsche Zeilen löschen.


    Beitrag zuletzt geändert: 5.3.2011 17:33:40 von darkpandemic
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!