[sh] Prüfen ob ein prozess aktiv ist?

E

Eichi

Hallo zusammen,

bei all den Tutorials die im Netz zumfliegen wundert es mich, dass es keine genaue beschreibung zu diesem Thema gibt Oo

naja egal...

Was ich gerne machen möchte ist eine if-Abfrage, die feststellen soll ob ein Prozess aktiv ist und falls dieser Prozess aktiv ist diesen killen soll. In diesem Beispiel conky.
Was müsste ich dafür anstelle des dicken Textes einsetzen?

Code:
if [ [b]Der Prozess conky aktiv[/b]   ]; then
  sudo killall conky
  echo "\033[31m conky killed"
  exit 1
else
  echo -e "\033[0m Prozess nicht aktiv"
fi

if [ [b]Der Process lxpanel aktiv[/b] ]; then
  sudo killall lxpanel
  echo "\033[31m lxpanel killed"
  exit 1
else
  echo -e "\033[0m Prozess nicht aktiv"
fi
echo -e "\033[0m finished"
 
Zuletzt bearbeitet von einem Moderator:
Hi,

OS? Shell?

Ich habe da auch erst letztens mal kurz drueber nachgedacht, und was mir so auf die schnelle einfiel war folgendes:
Code:
ps_name="foo"
if [ $(ps -e | grep -c ${ps_name}) -gt 0 ]; then
    # process ps_name is running, do stuff
fi
Das sollte mit GNU ps, GNU grep und GNU Bash funktionieren.

mfg,
bytepool
 
Zuletzt bearbeitet:
OS: Ubuntu
Shell: GNU Bash

Habe es ausprobiert, zumindest kommt es jetzt soweit, dass conky gekillt wird. Jetzt wird die If-Abfrage aber trotzdem ausgeführt, auch wenn der Prozess conky garnicht gestartet wird


Code:
conky: no process killed
 conky killed
 
Hi,

da gibt es ein geniales Konzept, das nennt sich Debugging. ;)
Bei mir funktioniert das Perfekt, ohne mehr Angaben kann ich da auch nix zu sagen. Lass dir einfach mal die wichtigsten Infos ausgeben, und guck was da falsch laeuft...

Edit:
Ah, eine Sache faellt mir doch noch ein. Eventuell schliesst er den grep Prozess mit ein, dann muss es natuerlich -gt 1 sein.

mfg,
bytepool
 
Zuletzt bearbeitet:
hmm das script sieht jetzt so aus:
Code:
ps_name="conky"
if [ $(ps -elf | grep -c ${ps_name}) -gt 1 ]; then
  sudo killall conky
  echo -e "\033[31m conky killed"
  exit 1
fi
echo -e "\033[0m finished"

und vom debugger ausgegeben wird:
Code:
ps_name="conky"
+ ps_name=conky
if [ $(ps -elf | grep -c ${ps_name}) -gt 1 ]; then
  sudo killall conky
  echo -e "\033[31m conky killed"
  exit 1
fi
ps -elf | grep -c ${ps_name}
++ ps -elf
++ grep -c conky
+ '[' 1 -gt 1 ']'
echo -e "\033[0m finished"
+ echo -e '\033[0m finished'
 finished

Mit der information kann ich atm nicht viel anfangen ^^ Ich werde mal nach nem debugger tutorial suchen

Sorry bin noch neu in sachen shell-scripting =)
 
Zuletzt bearbeitet von einem Moderator:
Hi,

Code:
if [ $(ps -elf | grep -c ${ps_name}) -gt 1 ]; then
das -lf kann man auch weglassen, das steht eigentlich nur fuer extra Formatierung, das habe ich bei meinem obigen Post auch schon angepasst.

Ich meinte eigentlich auch nicht, dass du extra einen Debugger bemuehen musst. ;)
Debugging ist allgemein der Prozess Programmfehler zu finden. Debugger koennen dabei sehr hilfreich sein, aber du kannst dir auch einfach mit printlines, bzw. echo statements die wichtigen Infos ausgeben lassen, erst recht wenn es um so etwas triviales geht.

Aber mich wuerde interessieren wie du jetzt an die Debug Informationen gekommen bist. Kennt Bash da eine extra Option fuer?

Code:
+ '[' 1 -gt 1 ']'
Na, da steht doch das wichtigste, es wird getestet ob 1 groesser 1 ist. Die einzige Frage waere jetzt noch, ob der Prozess da gerade lief oder nicht, aber das wirst du ja wissen. ;)

mfg,
bytepool
 
hm ich habe die 1 bei "-gt 1" wieder durch eine 0 ersetzt und jetzt scheint das script zu funktionieren.

Ich habe im Internet rumgesucht. Da stand, dass man ein script debuggen kann in dem man die option -xv eingibt.

Also quasi:

bash -xv scriptname

Vielen Dank für deine Hilfe =)
 
Nochmal für alle die es interessiert (oder die sich hierher verirren), das fertige script:

Code:
ps_name="conky"
if [ $(ps -e | grep -c ${ps_name}) -gt 0 ]; then
  sudo killall ${ps_name}
  echo "\033[31m ...${ps_name} killed"
else
  echo "\033[0m ${ps_name}: killing failed!"
fi
echo "\033[0m ...finished"
 
Tut's nicht auch ein einfaches
Code:
if [ $(pgrep conky) ]; then ....
?
 
Zuletzt bearbeitet:
Hi,

wenn man pgrep kennen wuerde, waere das sicherlich die bessere Wahl, ja. ;)

Danke, wieder was gelernt. Wobei einfach nur "if [ $(pgrep foo) ]" zu Syntax Fehlern fuehren wird. Aber das ist ja leicht anzupassen, z.B. mit "[ -z $(pgrep foo) ]".
Oder noch simpler, mit "if $(pgrep foo)", was du wahrscheinlich auch meintest.

Edit:
Ehh, "if pgrep foo" natuerlich, nicht if $(pgrep foo)... Dann bekommt man aber auch noch den output davon zu sehen, so gesehen ist der Test mit -z vielleicht doch schoener. Ich stell mich ja schon in die Ecke. ;)

mfg,
bytepool
 
Zuletzt bearbeitet:
Hm, also "hier" funktioniert ein
Code:
    if [ ! "$(pgrep boinc)" ]; then ....
(Weiß garnicht mehr, warum ich so rum prüfe... aber's funktioniert auch andersrum :)
Code:
{-alex-|-asterix-} => [~]
(12:33:55) if [ $(pgrep firefox) ]; then echo "juhu"; else echo "blub"; fi;
juhu
{-alex-|-asterix-} => [~]
(12:35:37) if [ $(pgrep dasIstGarKeinProzess) ]; then echo "juhu"; else echo "blub"; fi;
blub
)

/Edit: Eigentlich dachte ich sogar, das du mich mal drauf hingewiesen hattest, deswegen hab ich mich bissl gewundert :D Aber's war Aqualung hier.
 
Zuletzt bearbeitet:
Tatsaechlich, [ ] akzeptiert auch leere Argumente... Wie gut dass ich schon in der Ecke sitze. ;)

mfg,
bytepool
 

Ähnliche Themen

NAS-Drive Mount in Bash-Script über crontab

HandbrakeCLI Shell Skript

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Shell-Skript nicht doppelt starten

Löschroutine mit Überprüfung

Zurück
Oben