exec in cronjobs

pHoEnIx-sTyLe

Registered User
Hallo,

ich habe folgendes Problem: Wenn ein exec befehl in meinem cronjob (PHP-Datei) ausgeführt wird bekomme ich eine Fehlermeldung: "sh: /ps: No such file or directory".

Jetzt bin ich mir nicht sicher ob ich in einem Cronjob überhaupt den Exec Befehl ausführen kann oder ob es einfach Probleme gibt da er nich weiss welchen Benutzer er nehmen muss.

Im normalbetrieb, also aufruf der PHP-Datei, funktioniert es.

Ist es nun möglich in einem Cronjob über die PHP-Funktion exec Befehle und Ausgaben vom Server zu erhalten. Wenn ja: wie?

Der Safe-Mode ist übrigens auf Off gestellt.
 
Was steht in deiner exec()-Commandline?
Ist das Programm absolut oder relativ angegeben?

Cron lädt nicht das Env den Users und somit ist $PATH auch nicht gesetzt.
 
ist leider vollkommen egal was sich in der Commandline befindet. Alle Befehle enden in dieser Fehlermeldung.

eigentlich soll nur geprüft werden ob ein bestimmter prozess läuft. (ps pid)
 
:eek: Und dafür verwendest Du ein PHP-Skript? Fährst Du auch erst nach Bangladesh mit dem Fahrrad wenn Du ins Nachbardorf wolltest?
 
... Du weisst ja überhaupt nicht was ich mit meinem ergebnis anstellen will. Natürlich kann ich auch so in die Console gehn und das abfragen. Aber das ist nicht Sinn der Sache.
 
Last edited by a moderator:
ist leider vollkommen egal was sich in der Commandline befindet.
Auch, ob es mit oder ohne kompletten Pfad angegeben wird? ps ist auch nur ein Programm und liegt unter `which ps` - alles klar?

BTW: Ich muss da marneus vollkommen Recht geben.
 
Was auch immer Du mit dem Ergebnis anfangen willst, es geht deutlich eleganter und einfacher.

Poste doch mal, wozu es eigtl. gut ist.
 
Auch, ob es mit oder ohne kompletten Pfad angegeben wird? ps ist auch nur ein Programm und liegt unter `which ps` - alles klar?

achso dafür muss auch ein pfad angegeben werden? das hab cih jetzt nciht gewusst. und wie sieht dann mein pfad bzw. meine commandline ca. dafür aus?


Wenn es eine elegantere und einfachere Lösung gibt dann immer her damit. Es geht darum dass ich einen Script dauerhaft im Hintergrund laufen lasse. Ein Cronjob prüft jede Minute ob der Script ausgefallen ist. Wenn ja soll er diesen wieder starten. Dazu schreibe ich die PID in eine Textdatei und will eigentlich prüfen ob der Script noch läuft.
 
Das realisierst Du mit einem PHP-Skript oder liest Du mit dem PHP-Skript nur aus? (Es heisst übrigens das Skript)
 
Es geht darum dass ich einen Script dauerhaft im Hintergrund laufen lasse. Ein Cronjob prüft jede Minute ob der Script ausgefallen ist. Wenn ja soll er diesen wieder starten. Dazu schreibe ich die PID in eine Textdatei und will eigentlich prüfen ob der Script noch läuft.
* * * * * ps -A|grep `cat /tmp/pidfile`|grep <prozessname> >/dev/null || /path/to/script
 
Das realisierst Du mit einem PHP-Skript oder liest Du mit dem PHP-Skript nur aus?

Beides. Der (oder von mir aus auch:das) PHP Script ermittelt die PID (getmypid();) und schreibt diese in eine Textdatei. Danach wird der Script gestartet. In dem Falle ist es eine Endlosschleife. Falls der Script ausfallen sollte wird er zwar schon neugestartet da bei jedem Durchlauf der Endlosschleife ein timestamp in eine andere .txt Datei geschrieben wird. Der Cron prüft dann ob der timestamp älter als 60 Sekunden ist und startet wahlweise neu. Aber falls der Script mal länger als 60 Sekunden brauchen sollte (ist nicht beabsichtigt und passiert eigentlich auch nicht), dann würde er doppelt laufen. Deshalb wollte ich auf einen laufenden Prozess prüfen.

* * * * * ps -A|grep `cat /tmp/pidfile`|grep <prozessname> >/dev/null || /path/to/script

ok, danke. nur eine Sache. normalerweiße muss bei einem cronjob noch das verzeichnis der jeweiligen php version angegeben werden (jedenfalls ist das bei plesk notwendig). normal wird das ja vor den scriptpath gesetzt. hier auch? (* * * * * ps -A|grep `cat /tmp/pidfile`|grep <prozessname> >/dev/null || /usr/bin/php5 /path/to/script) ?
ich nehme an der prozessname muss nicht die klammern <> enthalten?
habe bisher einem prozess selbst nie einen namen gegeben. deshalb die frage.
werden die pid's im ordner pidfile automatisch entfernt?
 
Der grep nach dem Scriptname ist igentlich nur dazu da, um den Fall abzufangen, dass inzwischen ein neuer Prozess die alte PID bekommen hat und der Check fälschlicherweise annimt, der Prozess würde noch laufen.
prozessname ist dabei der Name des Prozesses in der Ausgabe von "ps -A".

Die Cron-Zeile muss natürlich entsprechend angepasst werden. Die war nur beispielhaft, um zu zeigen, worauf ich damit hinaus wollte.
 
Der grep nach dem Scriptname ist igentlich nur dazu da, um den Fall abzufangen, dass inzwischen ein neuer Prozess die alte PID bekommen hat und der Check fälschlicherweise annimt, der Prozess würde noch laufen.
prozessname ist dabei der Name des Prozesses in der Ausgabe von "ps -A".

Die Cron-Zeile muss natürlich entsprechend angepasst werden. Die war nur beispielhaft, um zu zeigen, worauf ich damit hinaus wollte.

ok gut. sry aber ich kann das noch nicht ganz nachvollziehen. das prinzip ist mir klar. aber wie ich genau meinen cron anpassen müsste weiss ich noch nicht.

* * * * * ps -A|grep `cat /tmp/pidfile`|grep <prozessname> >/dev/null || /usr/bin/php5 /srv/www/vhosts/test123.com/httpdocs/crons/test123.php

`cat /tmp/pidfile`|grep <prozessname> > <- wie diese stelle nun genau aussehen müsste ist für mich noch unverständlich. also am besten wäre was ich hier noch anpassen muss und auf welche weise. oder beispielweiße eine genaue cronzeile welche ich eintragen könnte bzw funktionieren würde.

Aber ich muss zugeben die Variante ist viel eleganter und einfacher.
 
Code:
* * * * * ps -ef|grep `cat /tmp/pidfile`|grep test123.php >/dev/null || /usr/bin/php5 /srv/www/vhosts/test123.com/httpdocs/crons/test123.php

/tmp/pidfile muss noch durch die Datei ersetzt werden, in die Du die PID reinschreibst. Bitte beachten, dass hier 'ps -ef' verwendet wird, da nicht nach dem Programmnamen (php5) sondern nach einem der Argumente (test123.php) gesucht wird.
 
Code:
* * * * * ps -ef|grep `cat /tmp/pidfile`|grep test123.php >/dev/null || /usr/bin/php5 /srv/www/vhosts/test123.com/httpdocs/crons/test123.php

/tmp/pidfile muss noch durch die Datei ersetzt werden, in die Du die PID reinschreibst. Bitte beachten, dass hier 'ps -ef' verwendet wird, da nicht nach dem Programmnamen (php5) sondern nach einem der Argumente (test123.php) gesucht wird.

Ok danke. Ich werde das gleich mal testen.
 
Ich bekomme folgende Meldung:

Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

Also Datei in welche die PID eingetragen werden soll habe ich eine .log Datei eingetragen also Beispiel:

* * * * * ps -ef|grep `cat /srv/www/vhosts/test123.com/httpdocs/files/pid_test.log`|grep cron_unregister.php >/dev/null || /usr/bin/php5 /srv/www/vhosts/test123.com/httpdocs/crons/cron_test.php
 
Wenn der Fehler kommt, ist /srv/www/vhosts/test123.com/httpdocs/files/pid_test.log leer.
Was ist die Ausgabe von
Code:
cat /srv/www/vhosts/test123.com/httpdocs/files/pid_test.log
?
 
Wenn der Fehler kommt, ist /srv/www/vhosts/test123.com/httpdocs/files/pid_test.log leer.
Was ist die Ausgabe von
Code:
cat /srv/www/vhosts/test123.com/httpdocs/files/pid_test.log
?

Die Ausgabe ist leer. Also es gibt keine Ausgabe wenn ich das so in der Console aufrufe. Das heisst konkret die PID konnte nicht geloggt werden?
 
So langsam wird es echt ne lange Zeile ;)


Dieser Job startet den Prozess dann, wenn kein File existiert oder der Prozess nicht läuft:
Code:
PIDFILE=/srv/www/vhosts/test123.com/httpdocs/files/pid_test.log

* * * * * ( [ ! -f $PIDFILE ] || ! ps -ef|grep `cat $PIDFILE`|grep cron_unregister.php >/dev/null ) && /usr/bin/php5 /srv/www/vhosts/test123.com/httpdocs/crons/cron_unregister.php

Dieser tut dies nur, wenn das PID-File existiert:
Code:
PIDFILE=/srv/www/vhosts/test123.com/httpdocs/files/pid_test.log

* * * * * ( [ -f $PIDFILE ] && ! ps -ef|grep `cat $PIDFILE`|grep cron_unregister.php >/dev/null ) && /usr/bin/php5 /srv/www/vhosts/test123.com/httpdocs/crons/cron_unregister.php
 
Last edited by a moderator:
Ich glaub so ne lange Cronzeile seh ich das erste mal :D ^^

@ elias5000: ok, danke. Aber besteht das Problem nicht weiterhin dass kein Eintrag in das log file gemacht wird?
 
Back
Top