system() mit PHP

stefan6

New Member
Hallo Zusammen,

ich habe mir ein PHP Script zur Abarbeitung von Tasks gebaut:

PHP:
#!/usr/bin/php -q
<?php
	
	$node = '1';

	$mysqlconnect = mysql_connect("....");
	$mysqlselect = mysql_select_db("...");

	$sql = mysql_query("SELECT * FROM vserver_daemon WHERE node = '".$node."'");
	while($row = mysql_fetch_assoc($sql)) {
		$command = system(''.$row['task'].'');
		mysql_query("DELETE FROM vserver_daemon WHERE id = '".$row['id']."'");
		if($row['art'] == "start") {
			mysql_query("UPDATE vserver SET status = '1' WHERE veid = '".$row['veid']."'");
		}
		if($row['art'] == "stop") {
			mysql_query("UPDATE vserver SET status = '0' WHERE veid = '".$row['veid']."'");
		}
		mysql_query("INSERT INTO vserver_log SET veid = '".$row['veid']."', datum = '".time()."', task = 'vServer -".$row['art']."-'");
	}

?>


Wenn ich dieses Script per Shell aufrufe, wird alles ausgeführt. Nun habe ich einen Cronjob eingerichtet, alle Aktionen bis auf das system() werden ausgeführt. woran kann das liegen?

Code:
*       *       *       *       *       /root/daemon.php
 
Vermutung:
* in $row['task'] eine falsche Syntax für die Shell
* Cron-Job nicht die Rechte zum Ausführen des system-Aufrufs
* cron-Job falsch erstellt

Wie wäre es mit
* * * * * /usr/bin/php -f /root/daemon.php
 
Last edited by a moderator:
Wenn es in der Shell geht aber als Cron nicht, tippe ich auf eine fehlende PATH-Variable in der Cron-Umgebung.

huschi.
 
Hey,
probier’s doch mal folgendermassen:
PHP:
$command = system($row['task']);
Oder:
PHP:
$command = system("$row['task']");

So sollte es funktionieren sofern etwas in der Variabel enthalten ist
 
Danke für die Antworten.

Das verwunderliche ist ja, wenn ich es so per Shell ausführe, ruft er es auch auf.
Es geht hier um vzctl, das vServer auf OpenVZ Basis neustarten soll.

Es steht in $row['task'] z.B folgendes: vzctl start 100


wenn ich es so über die Shell aufrufe, macht er alles, nur als Cron lässt er den teil aus!
 
Shellrechte und -Umgebungsvariablen (Pfade etc.) sind nicht unbedingt dieselben wie die des Cronjobs.
Deswegen stehen in Cronjobs oft die ausgeschriebenen Pfade.
 
Als welcher User lässt Du den Cronjob ausführen? Trag den Cronjob eventuell 'mal in /etc/crontab mit
Code:
* * * * * root <Befehl>
ein...
 
Der Cronjob wird ausgeführt und alle PHP aktionen.....

Nur es wird unter system nichts gemacht. Habe den Pfad hier auf /usr/sbin/vzctl auch schon gesetzt.

Genau das gleiche...
 
Es ist wohl oben entgangen: PATH-Variable sollte für Cron gesetzt werden.
Denn auch vzctl braucht die.

Und wenn das immer noch nicht reicht, braucht es evtl. noch weiter Environment-Variablen.

huschi.
 
Du hast in Deinem system() statt zweier doppelter Hochkommata (") vier einfache Hochkommata ('), wodurch Du einen leeren String an das System übergeben hast.
Geht schöner, aber Dein Code ist eh schon nicht der Schönste:
Code:
system(" . $row['task'] . ", $return_val)
if ($return_val == 0) {
    do something
} else {
    do errorhandling
}
Dein Fehler kommt übrigens vom blinden Copy&Paste aus irgendwelchen Tutorials...


EDITh sagt: Habe ein Komma gesehen wo keines ist, also vergiss meine Posts, mit Ausnahme des Errorhandling, welches Du dringend umsetzen solltest.
 
Last edited by a moderator:
Das Problem waren die PFade! Vielen Dank!

Hat jemand von euch eine Idee, wie ich über das Hostsystem den belegten Arebitsspeicher und HDD auslesen kann?

Evtl. jemand Ansätze?


Danke :)
 
Arbeitsspeicher:
mit system free -m aufrufen und die richtige Spalte mit mit PHPs Stringfunktionen auslesen.

HD:
mit system df -h aufrufen und die richtige Spalte mit mit PHPs Stringfunktionen auslesen.
 
Für das Hostsystem habe ich das ja bereits!

Aber für die Container funktioniert dies nicht, da ich ja keinen direkten Zugriff darauf habe.
 
Back
Top