Cronjob Berechtigungen
Hallo zusammen. Ich habe folgendes Problem: Ich habe ein PHP-Skript, dass per Cronjob regelmässig gewisse Daten in eine MySQL-Datenbank importieren muss. Dieses Skript wird einmal pro Tag ausgeführt. Nun ist es aber so, dass ein Teil dieses Skriptes (FTP Up/Download auf einen anderen Server) per Cronjob nicht funktioniert. Wenn ich das Skript aber per SSH angemeldet laufen lasse (als root) funktioniert alles. Nur beim Cronjob nicht, der ebenfalls als root läuft. Kann mir da jemand helfen? Viele Grüsse, NiX - Erich Troxler.
* On Wed, 21 Jan 2004 at 17:51 +0100, NiX - Erich Troxler wrote:
Ich habe ein PHP-Skript, dass per Cronjob regelmässig gewisse Daten in eine MySQL-Datenbank importieren muss. Dieses Skript wird einmal pro Tag ausgeführt.
Nun ist es aber so, dass ein Teil dieses Skriptes (FTP Up/Download auf einen anderen Server) per Cronjob nicht funktioniert. Wenn ich das Skript aber per SSH angemeldet laufen lasse (als root) funktioniert alles. Nur beim Cronjob nicht, der ebenfalls als root läuft.
Rufst Du aus dem Job aus die Programme mit dem vollen Pfad auf? Du hast in einem laufenden Job nicht den gleichen Pfad, wie normalerweise auf der Shell "draussen", sondern nur einen eingeschränkten - siehe /etc/crontab, ganz oben. Entweder: Im Skript selber per PATH=xxx den Pfad selber setzen, oder einfach vor den Aufrufen den ganzen Pfad zum jeweiligen Programm vorsetzen. Wenn es das nicht war, dann beschreibe bitte ein wenig genauer was nicht passt (z.B. was in der Mail steht, die Dir der cron-Daemon sendet). /apm -- GPG welcome, request public key: mailto:adalbert+key@lopez.at
Hallo. Von: Adalbert Michelic [mailto:adalbert+list@lopez.at]
* On Wed, 21 Jan 2004 at 17:51 +0100, NiX - Erich Troxler wrote:
Ich habe ein PHP-Skript, dass per Cronjob regelmässig gewisse Daten in eine MySQL-Datenbank importieren muss. Dieses Skript wird einmal pro Tag ausgeführt.
Nun ist es aber so, dass ein Teil dieses Skriptes (FTP Up/Download auf einen anderen Server) per Cronjob nicht funktioniert. Wenn ich das Skript aber per SSH angemeldet laufen lasse (als root) funktioniert alles. Nur beim Cronjob nicht, der ebenfalls als root läuft.
Rufst Du aus dem Job aus die Programme mit dem vollen Pfad auf?
Ja, so: 15 4 * * * root /usr/bin/dataimport.cron Und die dataimport.cron: #!/usr/bin/dataimport.cron mysql -u xxxx -pxxxxxxxxx xxxx
Du hast in einem laufenden Job nicht den gleichen Pfad, wie normalerweise auf der Shell "draussen", sondern nur einen eingeschränkten - siehe /etc/crontab, ganz oben.
SHELL=/bin/sh PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin MAILTO=root
Entweder: Im Skript selber per PATH=xxx den Pfad selber setzen, oder einfach vor den Aufrufen den ganzen Pfad zum jeweiligen Programm vorsetzen.
Ist doch bereits gemacht?
Wenn es das nicht war, dann beschreibe bitte ein wenig genauer was nicht passt (z.B. was in der Mail steht, die Dir der cron-Daemon sendet).
In der E-Mail, die ich bekomme ist alles ok. Sogar die PHP Rückmeldungen stimmen. Grüsse, NiX - Erich Troxler.
* On Wed, 21 Jan 2004 at 18:37 +0100, NiX - Erich Troxler wrote:
Von: Adalbert Michelic [mailto:adalbert+list@lopez.at]
* On Wed, 21 Jan 2004 at 17:51 +0100, NiX - Erich Troxler wrote: [FTP Up/Download aus Cronjob via PHP-Skript funktioniert nicht] Entweder: Im Skript selber per PATH=xxx den Pfad selber setzen, oder einfach vor den Aufrufen den ganzen Pfad zum jeweiligen Programm vorsetzen.
Ist doch bereits gemacht?
Noe:
mysql -u xxxx -pxxxxxxxxx xxxx
Ich meinte da davor den Pfad. Aber nachdem die Programme scheinbar eh aufgerufen werden, ist das nicht der Fehler.
Wenn es das nicht war, dann beschreibe bitte ein wenig genauer was nicht passt (z.B. was in der Mail steht, die Dir der cron-Daemon sendet).
In der E-Mail, die ich bekomme ist alles ok. Sogar die PHP Rückmeldungen stimmen.
Gut. Und wie äussert sich nun das Problem? Wie führst Du den FTP Up/Download durch? Welches Programm, kann man da Rückgabewerte abfragen, wie sieht die entsprechende Stelle im Skript aus? /apm -- GPG welcome, request public key: mailto:adalbert+key@lopez.at
Hallo. Von: Adalbert Michelic [mailto:adalbert+list@lopez.at]
Gut. Und wie äussert sich nun das Problem? Wie führst Du den FTP Up/Download durch? Welches Programm, kann man da Rückgabewerte abfragen, wie sieht die entsprechende Stelle im Skript aus?
Eine entscheidende Stelle im Skript ist so aufgebaut: PHP geht auf einen FTP-Server und überschreibt dort eine Datei. Wenn das erfolgreich war, gibt PHP dies mit einem kleinen Text zurück. Das Problem dabei: Diese "ok-Meldung" (if (fputs blabla)) kommt wenn ich dieses Skript von Hand ausführe und wenn ich es automatisch ausführen lasse. Aber wirklich geändert wird diese Datei nur, wenn ich es manuell mache. Es scheint irgendein Problem mit dem Cronjob vorhanden zu sein. PS.: Ein Fehler im PHP-Skript (if falsch und so) ist es nicht. Dieses Skript funktioniert auf einem anderen Server problemlos. Gruss, NiX - Erich Troxler.
Hallo Erich, * On Wed, 21 Jan 2004 at 18:59 +0100, NiX - Erich Troxler wrote:
Von: Adalbert Michelic [mailto:adalbert+list@lopez.at]
Gut. Und wie äussert sich nun das Problem? Wie führst Du den FTP Up/Download durch? Welches Programm, kann man da Rückgabewerte abfragen, wie sieht die entsprechende Stelle im Skript aus?
Eine entscheidende Stelle im Skript ist so aufgebaut:
PHP geht auf einen FTP-Server und überschreibt dort eine Datei. Wenn das erfolgreich war, gibt PHP dies mit einem kleinen Text zurück.
Aha. Kann ich davon ausgehen, daß Du die Funktionen verwendest, die in http://www.php.net/ftp beschrieben sind?
Das Problem dabei: Diese "ok-Meldung" (if (fputs blabla)) kommt wenn ich dieses ^^^^^ fputs? Schreibst Du direkt in einen via fsockopen() geöffnet Socket?
Skript von Hand ausführe und wenn ich es automatisch ausführen lasse. Aber wirklich geändert wird diese Datei nur, wenn ich es manuell mache. Es scheint irgendein Problem mit dem Cronjob vorhanden zu sein.
Tja. Ich tue mir ehrlich gesagt ein wenig schwer, zu erraten, wo es haken könnte, wenn ich nicht weiß, was da genau passiert. Könntest Du bitte die relevanten Teile aus dem PHP-Programm copy'n'pasten und hierher oder mir per PM schicken, ansonsten kann Dir zumindest ich leider nicht weiterhelfen (bzw. ich kann es nicht einmal versuchen).
PS.: Ein Fehler im PHP-Skript (if falsch und so) ist es nicht. Dieses Skript funktioniert auf einem anderen Server problemlos.
Das, mit Verlaub, ist zwar für "funktionieren" notwendig, aber nicht hinreichend. /apm -- GPG welcome, request public key: mailto:adalbert+key@lopez.at
Hallo. Von: Adalbert Michelic [mailto:adalbert+list@lopez.at]
* On Wed, 21 Jan 2004 at 18:59 +0100, NiX - Erich Troxler wrote:
Von: Adalbert Michelic [mailto:adalbert+list@lopez.at]
Gut. Und wie äussert sich nun das Problem? Wie führst Du den FTP Up/Download durch? Welches Programm, kann man da Rückgabewerte abfragen, wie sieht die entsprechende Stelle im Skript aus?
Eine entscheidende Stelle im Skript ist so aufgebaut:
PHP geht auf einen FTP-Server und überschreibt dort eine Datei. Wenn das erfolgreich war, gibt PHP dies mit einem kleinen Text zurück.
Skript von Hand ausführe und wenn ich es automatisch ausführen lasse. Aber wirklich geändert wird diese Datei nur, wenn ich es manuell mache. Es scheint irgendein Problem mit dem Cronjob vorhanden zu sein.
Tja. Ich tue mir ehrlich gesagt ein wenig schwer, zu erraten, wo es haken könnte, wenn ich nicht weiß, was da genau passiert.
Könntest Du bitte die relevanten Teile aus dem PHP-Programm copy'n'pasten und hierher oder mir per PM schicken, ansonsten kann Dir zumindest ich leider nicht weiterhelfen (bzw. ich kann es nicht einmal versuchen).
Hier: <?php $ftp = ftp_connect("domain.ch"); ftp_login($ftp,"user","pwd"); $file = ftp_nlist($ftp,"/"); $count = count($file); for ($i=0;$i<$count;$i++) { if (eregi("file2.icp",$file[$i])) { $work = "yes"; echo "FTP-Verbindung steht\nDie Datei file2.icp wurde gefunden\n"; } } if ($work == "yes") { $rename = ftp_rename($ftp,"file.icp","temp.icp"); $rename2 = ftp_rename($ftp,"file2.icp","file.icp"); $rename3 = ftp_rename($ftp,"temp.icp","file2.icp"); // Error Report // if ($rename != TRUE OR $rename2 != TRUE OR $rename3 != TRUE) { // // E-Mail Versand mit dem Fehler // } $zeiger = fopen("temp.tmp","w+"); if (ftp_fget($ftp,$zeiger,"file.icp",FTP_ASCII)) echo "Temp wurde geschrieben"; fclose($zeiger); $zeiger = fopen("temp.tmp","r"); $long = filesize("temp.tmp"); $data = fread($zeiger,$long); if (eregi("database1",$data)){ $ziel = fopen("/srv/www/htdocs/html/config/db.php","w+"); if (fputs($ziel,"<?php\n\$mysqldb = \"database2\";\n?>")) { echo "\ndb.php (DB 2) wurde geschrieben\n"; } else { echo "\ndb.php (DB 2) konnte nicht geschrieben werden\n"; } fclose($ziel); } elseif (eregi("database2",$data)){ $ziel = fopen("/srv/www/htdocs/html/config/db.php","w+"); if (fputs($ziel,"<?php\n\$mysqldb = \"database1\";\n?>")) { echo "\ndb.php (DB 1) wurde geschrieben\n"; } else { echo "\ndb.php (DB 1) konnte nicht geschrieben werden\n"; } fclose($ziel); } else { // // E-Mail Versand mit dem Fehler // } fclose($zeiger); } else { // // E-Mail Versand mit dme Fehler // } ftp_quit($ftp); echo "\n"; ?> Ausgabe davon (per E-Mail): Content-type: text/html X-Powered-By: PHP/4.3.3 FTP-Verbindung steht Die Datei file2.icp wurde gefunden Temp wurde geschrieben db.php (DB 2) wurde geschrieben Vielen Dank, NiX - Erich Troxler.
* On Wed, 21 Jan 2004 at 21:40 +0100, NiX - Erich Troxler wrote:
Von: Adalbert Michelic [mailto:adalbert+list@lopez.at]
* On Wed, 21 Jan 2004 at 18:59 +0100, NiX - Erich Troxler wrote: [Cronjob tut nicht so, wie er soll]
Okay, folgendes ist mir aufgefallen:
if (fputs($ziel,"<?php\n\$mysqldb = \"database2\";\n?>")) {
fputs liefert die Anzahl der geschriebenen Bytes zurück, im Fehlerfall -1. Das if behauptet bei -1 genauso, daß alles okay ist, wie wenn da 17 zurückkäme. Vergleiche, ob der Rückgabewert > 0 ist. Welcher File ist jetzt eigentlich der, der nicht geschrieben wird? /apm -- GPG welcome, request public key: mailto:adalbert+key@lopez.at
Hallo. Von: Adalbert Michelic [mailto:adalbert+list@lopez.at]
* On Wed, 21 Jan 2004 at 21:40 +0100, NiX - Erich Troxler wrote:
Von: Adalbert Michelic [mailto:adalbert+list@lopez.at]
* On Wed, 21 Jan 2004 at 18:59 +0100, NiX - Erich Troxler wrote: [Cronjob tut nicht so, wie er soll]
Okay, folgendes ist mir aufgefallen:
if (fputs($ziel,"<?php\n\$mysqldb = \"database2\";\n?>")) {
fputs liefert die Anzahl der geschriebenen Bytes zurück, im Fehlerfall -1. Das if behauptet bei -1 genauso, daß alles okay ist, wie wenn da 17 zurückkäme. Vergleiche, ob der Rückgabewert > 0 ist.
Werde ich gerne mal testen.
Welcher File ist jetzt eigentlich der, der nicht geschrieben wird?
Auf dem FTP-Server wird eigentlich nicht mehr gemacht, als File1 in File2 umbennt und File2 in File1 (Zur Hilfe dazu eine Temp-Datei). Das funktioniert irgendwie nicht ganz. Das heisst, File1 wurde nicht durch File2 ausgetauscht und umgekehrt. Vielen Dank, NiX - Erich Troxler.
participants (2)
-
Adalbert Michelic
-
NiX - Erich Troxler