Linux: Überprüfen ob ein Screen läuft
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
all
anhang
antwort
befehlen
code
festen namen
kern
kleiner fehler
kommando
laufen
liste
machen
nummer
problem
programm
sagen
start
status
verhindern
vorstellen
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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.
-
@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 -
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 -
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
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage