FreeBSD + PHP + Rechte-Problem

LeoLinux

Well-Known Member
FreeBSD 8.0 RELEASE - amd64:
Mein PHP zeigt mir nicht alle laufenden Prozesse über "/bin/ps aux" an.
Selbst ein sudo bewirkt keine Unterschiede. Woran könnte das liegen?
Hier ein reproduzierbares Beispiel:

Code:
ps aux | grep 'httpd' | awk '{print $5}'


Grüße
 
... niemand ne Idee? Bzw. kann den "Fehler" so niemand so reproduzieren?

Code:
sudo -u www ps aux | grep 'httpd' | awk '{print $5}'
auf der Bash liefert einem das noch ein Ergebnis. Wenn ich das ganze dann aber in eine WebSite einbinde gehts nicht mehr ;( bzw. der Output bleibt einfach leer ...

Ich stelle dieses Problem nicht nur für den Apachen fest, sondern auch für den FreeRADIUS Daemon, named, mydns, nfcapd ... usw.
Für: ntpd, sshd, postgres, mysqld, dovecot etc. geht es hingegen aber wieder .. das ist total komisch ?!
 
Last edited:
Was will der Dichter damit sagen?

Also ich versteh ehrlich gesagt nur Bahnhof, wo liegt dein Problem?
Geht dein Apache nicht? oder dein PHP mit dem Apache nicht?

was willst du erreichen?
 
Gut, hier nochmal:

Ziel:
Über ein Webinterface den Speicherverbrauch eines Daemons auszulesen.

Weg:
Code:
sudo -u www ps aux | grep 'httpd' | awk '{print $5}'

Erläuterung:
"sudo -u www" verwende ich bei dem Test deshalb um von vorneherein zu erfahren, ob genügend Rechte vorhanden sind um den Befehl als Benutzer "www" später auszuführen - was ja der Fall sein wird, wenn ich den Befehl nachher in ein Webinterface einbinde, welches sich auf dem selben Rechner befindet.
Über "ps aux" lasse ich mir alle Prozesse des Systems auflisten.
Über "grep 'httpd'" filtere ich die des Apachen heraus.
Über "awk '{print $5}'" filtere ich mir den fünften Block der ps Ausgabe heraus, welcher mir den Wert ausgibt der derzeit im RAM-Riegel verweilt.

So, nachdem ich in meiner Bash so erfolgreich war bin ich nun hergegangen und habe das ganze in mein Webinterface migriert.

Auszug aus dem Code meines Webinterfaces:
Code:
[...]
$shell_cmd=shell_exec("/bin/ps aux | /usr/bin/grep '$daemon' | /usr/bin/awk '{print $5}'");
[...]

... und auch gleich ausprobiert, ob es denn auch tut was ich verlange ... und festgestellt, dass es das für einige Daemons auch macht und mir erfolgreich den Wert ausgibt, für einige ABER NICHT - so z.B. für radiusd, oder httpd.

Das komische an der Geschichte ist nun aber dass er mir, wenn ich es über die Bash mach, er mir den Wert ausspuckt - ausnahmslos - Nur in der PHP-Shell zeigt sich dieses komische Verhalten ... und ich kapiere nicht wieso.
Mein erster Gedanke war ein Rechteproblem - also habe ich der PHP-Shell testweise root-Rechte vergeben - jedoch erfolglos.

Konnte ich mein Problem nun verständlicher erklären? Falls nicht, bitte nochmal genau nachhaken wo es klemmt - ich werde mich dann bemühen den Engpass verbessert zu schildern.
 
Last edited:
Wie schließt du aus, dass er nicht den Speicherverbrauch des grep Kommandos ausgibt? Das ist meiner Erfahrung nach manchmal dabei und manchmal nicht.
 
Wie schließt du aus, dass er nicht den Speicherverbrauch des grep Kommandos ausgibt? Das ist meiner Erfahrung nach manchmal dabei und manchmal nicht.

Gar nicht, denn das macht er teilweise auch. Das ist das nächste Problem. Deshalb habe ich folgendes auch schon ausprobiert:

Code:
$shell_cmd=shell_exec("top -t -o size | egrep $daemon | awk -F' ' '{print $7}' | awk -F'K' '{print $1}'");

Doch leider greped er mir dabei immer nur das erst-beste Ergebnis raus anstelle alle Zeilen aufzulisten in denen meine "grep-Bedingung" vorkommt ... bei ntpd wäre das kein Problem, da es sowieso immer nur eine Zeile sein wird. Beim Apachen wird es aber problematisch, da er meistens über mehrere Zeilen geht.
Aus diesem Grund bin ich erst mal bei ps aux geblieben - in der Hoffnung das grep-Problem später beheben zu können.
 
P.S. Du wirst evtl. lachen, aber meine Tests haben ergeben, dass grep bei diesem Befehl mitgerechnet wird:
Code:
shell_exec("ps aux | grep '$daemon' |  awk '{print $5}'");

und bei diesem eigentlich identischen jedoch nicht:
Code:
shell_exec("/bin/ps aux | /usr/bin/grep '$daemon' | /usr/bin/awk '{print $5}'");

ich habe das allerdings nicht ausgibig genug und über einen längeren Zeitraum getestet ... nur etwa 15 mal innerhalb von 2 Minuten ...


Ein "Lösungsansatz" das grep herauszubekommen wäre eine Bedingung aufzustellen die überprüft wie alt die Prozesse die er da herausgegrept hat denn überhaupt sind, denn grep wird hierbei identisch mit der aktuellen Uhrzeit sein. Wenn dies der Fall ist, dann eben mit tail / head arbeiten um die letzte Zeile einfach rauszulöschen - denn wieder grepen wird das Problem wohl nicht lösen ;)
 
Back
Top