Problem mit Cronjob

ragey

Registered User
Hallo auf meinem Server läuft Plesk 8.0 dort wollte ich einen Cronjob anlegen.
Ich habe schon verschiedene Varianten getestet wie z.b.:
Code:
0 0 * * * GET [url]http://www.domain.de/.../script.php[/url]
0 0 * * * root /srv/www/vhosts/.../script.php
0 0 * * * /.../php /srv/www/vhosts/.../script.php
Leider alles ohne Erfolg.
Bei GET kommt: /bin/sh: GET: command not found
Bei root kommt: /bin/sh: root: command not found
Beim dritten weiss ich jetzt grad nicht die Meldung.

Die Variante mit dem PHP hatte ich schonmal gelesen.
Wie weiss ich wo das PHP Verzeichnis liegt?
 
Last edited by a moderator:
ragey said:
Richtig wäre hier "wget" statt "GET".

0 0 * * * root /srv/www/vhosts/.../script.php
Diese Version kommt nur in /etc/crontab vor. In den User-Crontabs (siehe "man crontab") braucht man den User nicht explizit anzugeben.

0 0 * * * /.../php /srv/www/vhosts/.../script.php
Hier fehlt der Interpreter: "php script.php".

Wie weiss ich wo das PHP Verzeichnis liegt?
Selber suchen: "whereis php"

PS: Hätte man alles per Boardsuche raus gefunden.

huschi.
 
Wo ist der Fehler?
Gegenfrage: Wo ist die Fehlermeldung?

Wenn Cron einen Befehl nicht ausführen kann schreibt es eine Mail an den Crontab-User und i.d.R. eine Zeile in die messages oder syslog.log.

Mögliche Fehlerquellen:
a) Der Cronjob steht in /etc/crontab.conf.
b) Der Pfad auf lynx ist nicht bekannt.
c) lynx ist auf dem System nicht installiert.
d) Es fehlt ein Space bei der Umleitung "2>&1 >/dev/null".

huschi.
 
Auch ein Problem

Hallo,
ich habe auch ein Problem mit einem cronjob und zwar haben wir ein Rootserver von Strato mit Plesk 8 auf dem wir diverse Gameserver laufen lassen z.B. CSS, dafür gebt es verschieden Plugins unter anderem HLstasX.
Dieses Plugin läuft auch fast einwandfrei bis auf eine Sache (Daily-Awards) damit das auch läuft muss man ein cronjob erstellen.
Nach einiger Suche im Internet habe ich auch herausgefunden wie das in etwa aussehen muss, aber leider funktioniert es nicht.

Der job sieht in etwa so aus:
1 * * * * /srv/www/vhosts/****/*****/hlstatsx/perl/hlstats-awards.pl
gebe ich ihn auf der Rootebene ein kommt folgende Meldung:

-bash: 1: command not found

gebe ich nur den Befehl auf der letzten ebene ein kommt:

-bash: hlstats-awards.pl: command not found

der Befehl liegt aber da und hat die Rechte 755

Ich weiß das man es nicht auf der Rootebene starten solte aber auch als Benutzer kommen die gleichen Meldenungen oder es steht "keine Berechtigung"
Ich wäre für jede Hilfe dankbar.

Bye Loser
 
Hallo und willkommen im Forum,

einen Cronjob kann man nicht einfach auf der Shell eingeben.

Um einen Cronjob zu erstellen musst du erst mal olgenden Befehl eingeben :
Code:
crontab -e
Das ganze mit dem User unter dem der Cronjob später auch laufen soll.
In dem dann erscheinenden Editor kannst du deinen Cronjob erstellen.

Damit eine Datei ausgeführt werden kann, also vom Cronjob gestarte werden kann, muss diese Datei erst Ausführbar gemacht werden.

Code:
chmod +x hlstats-awards.pl

Ich hoffe ich konnte dir ein wenig weiter helfen.
 
Hi,
die eingabe "chmod +x hlstats-awards.pl" habe ich durchgeführt, funktionierte auch sofort !

auf der Rootebene kann ich es crontab -e eingeben und ich sehe auch was schon läuft aber da soll er ja nicht laufen wenn nicht unbedingt nötig und als Benutzer zeigt mir Putty unter Eingabe von crontab -e

-bash: /usr/bin/crontab: Keine Berechtigung
:(

aber unter Plesk kann ich crontabs einrichten, habe ich vielleicht die falschen Zugriffe für Shell freigeben.

Hier habe ich diese Einstellung gemacht:
"Shellzugriff auf den Server mit Zugangsdaten eines FTP-Benutzers" = /bin/bash, vielleicht das ich da etwas verändern muss ?
:confused:

Nach eingabe der Befehlszeile "/srv/www/vhosts/********/httpdocs/hlstatsx/perl/hlstats-awards.pl" hat es aber sofort funktioniert das er die Daten abgerufen hat, jetzt hoffe ich das es auch mit dem Befehl klappt rest sehe ich leider erst morgen.

Die Eingabe des Befehls "2 1 * * * /srv/www/vhosts/*******/httpdocs/hlstatsx/perl/hlstats-awards.pl" hat er mir aber wieder dieser Meldung bestätigt:

-bash: 2: command not found


Erst einmal vielen Dank !!! :D

Bye
Loser
 
Last edited by a moderator:
Ich beantworte Deine Fragen in einer anderen chronologischen Reihenfolge, weil das sinnvoller ist.
"Shellzugriff auf den Server mit Zugangsdaten eines FTP-Benutzers" = /bin/bash, vielleicht das ich da etwas verändern muss ?
Hier stellt sich die Frage, ob überhaupt ein Shellzugriff vorhanden sein muss! Keiner meiner FTP-User hat Shellzugriff. Meine Kunden kriegen sowieso keinen :D und ich habe einen eigens dafür angelegten User (was jeder machen sollte!).
Um Deine Frage dennoch zu beantworten: /bin/bash ist korrekt!
-bash: /usr/bin/crontab: Keine Berechtigung
Warum das so ist, kann ich Dir nicht sagen. Es sollte problemlos funktionieren! Evtl. hilft uns zur weiteren Fehlereinschränkung die Ausgabe von:
Code:
 ls -la /usr/bin/crontab
.
Die Eingabe des Befehls "2 1 * * * /srv/...
Kann nicht funktionieren! "2 1 * * *" ist der Beginn der Zeichenkette in der crontab. Wenn Du die Datei manuell ausführen möchtest, musst Du folgendes eingeben:
Code:
perl /srv/www/vhosts/*******/httpdocs/hlstatsx/perl/hlstats-awards.pl

So long,
Henning
 
Hi,
Shellzugriff für den Benutzer (bin ich selbst, kein Kunde) habe ich auch nur mir selber gegeben, weil man ja nicht unbedingt crontabs auf Rootebene ausführen soll.(Habe ich jedenfalls gelesen)


Auf die Eingabe von "ls -la /usr/bin/crontab" erscheint folgende Meldung:

-rwsr-x--- 1 root trusted 33440 2005-09-09 18:30 /usr/bin/crontab

Der Befehl von Hand funktioniert ja, aber genau das ist das Problem er soll ja mittels crontab automatisiert werden und das bekomme ich ja nicht hin.
und ich frage mich ob der Befehl überhaupt richtig ist:
2 1 * * * /srv/www/vhosts/*******/httpdocs/hlstatsx/perl/hlstats-awards.pl

cu
loser
 
Hm, eigenartig - bei mir sind die Recht für die crontab schon mal ganz anders gesetzt:
Code:
-rwsr-xr-x  1 root trusted
Ferner musst du (vorsicht Halbwissen!) in der Crontab perl als Interpreter mitgeben - das weiß ich aber nicht!
Code:
2 1 * * * perl /path/to/script.pl

So long,
Henning
 
Hallo,

der Interpreter muß in der crontab mit Pfad angegeben werden:
Code:
2 1 * * * /path/to/perl /path/to/script.pl
 
Hi,
sorry aber ich verstehe nicht so genau was du damit meinst, die Datei die ich ausführen möchte heißt "hlstats-awards.pl" und sie liegt im Verzeichnis:

" /srv/www/vhosts/******/httpdocs/hlstatsx/perl/hlstats-awards.pl"

unter Plesk habe ich folgende crontab eingegen:
02 * * * * /srv/www/vhosts/be-ba.de/httpdocs/hlstatsx/perl/hlstats-awards.pl

Ich bekomme auch um diese Uhrzeit eine Mail, aber es geschieht nichts.
Wenn ich unter Putty als Root reingehe in den Ordner
/srv/www/vhosts/******/httpdocs/hlstatsx/perl/
und gebe folgendes ein
"/srv/www/vhosts/*****/httpdocs/hlstatsx/perl/hlstats-awards.pl"
wird der Befehl ausgeführt.

Wenn ich als Root "crontab -e" eingebe zeigt er mir jetzt auch den rconjob an,
die anderen cronkos verweisen aber nicht auf den Ordner "srv/www/usw." sonder gehen alle nach "usr/local/psa/usw." .
Ob es funktioniert werde ich erst in der Nacht sehen.
Was mir aber schon etwas komisch vorkommt,es geht nur auf der Rootebene, als Benutzer kommt immer
"-bash: /usr/bin/crontab: Keine Berechtigung".
Warum ?:confused:

Was meinst du mit Interpreter?

cu
Loser
Erst mal Thx für eure Hilfe!
 
Ich bekomme auch um diese Uhrzeit eine Mail
Was steht da drin? Ist es evtl. eine wichtige Fehlermeldung?

Du hast doch bereits ein ll auf crontab gemacht. Da steht die Antwort:
Die User dürfen es bei Dir nicht.
Entweder beabsichtigt, oder Du hast es unbeabsichtigt geändert. Abhilfe schaft ein "chmod o+x /usr/bin/crontab"

Was meinst du mit Interpreter?
Interpreter - Wikipedia
Die Endung .pl deutet auf Perl hin.

huschi.
 
Hi, man ich bin auch manchmal zu blöd, schon etliche male gelesen das die Mail wichtige Information enthalten könnte hier mal ein Kopie vom Inhalt, ich kann damt allerdings nichts anfangen:

Can't locate .//ConfigReaderSimple.pm in @INC (@INC contains: /usr/lib/perl5/5.8.7/i586-linux-thread-multi /usr/lib/perl5/5.8.7 /usr/lib/perl5/site_perl/5.8.7/i586-linux-thread-multi /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.7/i586-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.7 /usr/lib/perl5/vendor_perl .) at /srv/www/vhosts/**-****/httpdocs/hlstatsx/perl/hlstats-awards.pl line 50.

Sauber jo die Rechte waren nicht vergeben jetzt funktioniert es auch als Benutzer dort zeigt er mir jetzt auch den cronjob an. :)

Schön es geht immer ein Schritt weiter, nun mal abwarten was heute Nacht geschieht.

Danke ichmelde michdann morgen mal was geschehen ist.
Loser
 
Can't locate .//ConfigReaderSimple.pm
Der Fehler ist nun nicht wirklich schwer zu verstehen, oder?
Schau mal ob bei Deinem HLstats irgendwo diese Datei rumliegt.
Entweder mußt Du $opt_libdir anpassen, oder Du mußt den Cronjob anders schreiben:
Code:
cd /srv/www/vhosts/**-**.de/httpdocs/hlstatsx/perl/ && ./hlstats-awards.pl

huschi.
 
Code:
cd /srv/www/vhosts/**-**.de/httpdocs/hlstatsx/perl/ && ./hlstats-awards.pl

Das sollte so funktinieren, alle HLStatsX spezifischen Perl-Module/Dinge liegen im selben Verzeichnis wie die Perl Scripts selbst und werden von denen relativ referenziert also ./hlstats.conf oder ./ConfigReaderSimple.pm .

Aber noch eine andere Anregung ... Das Perl-Verzeichnis des Distributionsverzeichnisses muss nicht dort liegen, wo der Webauftritt liegt, dasselbe gilt fuer die SQL-Scripts. Das wird alles vom Webauftritt der HLStatsX nicht gebraucht.
Dem einen oder anderen (mir z.B.) ist es dann womoeglich lieber diese Sachen dann eher sagen wir im home-Verzeichnis eines Rollenbenutzers abzulegen der dann auch das hlstats.pl (der "Statsserver" der die Logmeldungen des Gameservers empfaengt und in die DB schreibt) ausfuehrt und zwar von dort aus.
Das ist dann noch etwas weniger zugaenglich als das Dokumentenverzeichnis des Webservers. Dort muss wirklich nur das /web Verzeichnis liegen (respektive dessen Inhalt), wo das davon benoetigte hlstatsinc liegt muss eh in der Konfiguration (/web/config.php) mitgeteilt werden.

Ciao,
Mercy.
 
Hi,
also er schein jetzt zu funktionieren ich habe den Befehl genommen, denn die andere Datei habe ich nicht gefunden :) .

cd /srv/www/vhosts/**-**.de/httpdocs/hlstatsx/perl/ && ./hlstats-awards.pl
.

Leider kann ich es jetzt erst wieder in der Nacht sehen (ab 0.00 Uhr) ob es geht, aber heute Mittag hat er auf jeden Fall den Befehl so wie er steht ausgeführt. ICh hatte ihn ja so sch fats geschrieben nur ohne &&, ich muß aber auch zugeben das ich die Bedeutung dafür nicht kenne.
 
Hallo auf meinem Server läuft Plesk 8.0 dort wollte ich einen Cronjob anlegen.
Ich habe schon verschiedene Varianten getestet wie z.b.:

0 0 * * * GET http://www.domain.de/.../script.php
0 0 * * * root /srv/www/vhosts/.../script.php
0 0 * * * /.../php /srv/www/vhosts/.../script.php

Leider alles ohne Erfolg.
Bei GET kommt: /bin/sh: GET: command not found
Bei root kommt: /bin/sh: root: command not found
Beim dritten weiss ich jetzt grad nicht die Meldung.

Die Variante mit dem PHP hatte ich schonmal gelesen.
Wie weiss ich wo das PHP Verzeichnis liegt?



Hast Du´s raus bekommen, ich habe ähnliche Probleme mit Verzeichnissen wenn ich php-script aufrufen will. Kannst du mir mal funktioniertende Zeile posten?
 
Entweder man ruft das Skript mit lynx auf, oder aber man nutzt das PHP CLI (Command Line Interface).

Code:
find /usr/bin -name php
Sollte Dir Aufschluss darüber geben, wo sich Deine PHP Binary befindet. Alternativ kannst Du auch einfach mal
Code:
php
in die Console hämmern und dann mit <Enter> (die dicke Taste irgendwo rechts auf der Tastatur) bestätigen oder aber
Code:
php
eingeben und 2x die <Tab>-Taste (links auf der Tastatur, eher länglich, in Form eines Rechtecks mit zwei entgegen gesetzten Pfeilen druff) drücken. Da sollte dann eine Liste von Auswahlmöglichkeiten erscheinen, wie z.B. diese hier:
Code:
php         php5        php5.old    php-config  phpextdist  phpize
Da Du scheinbar eine Plesk-Standardinstallation hast, wird PHP auch in der CLI Version vorliegen. Wenn nicht, musst Du PHP neu kompilieren (Gott bewahre...).

Nach diesen bahnbrechenden Erkenntnissen, können wir jetzt einfach mal die Hilfe der Binary anschauen. Das passiert miittels... na, Du ahnst es bereits... genau mit
Code:
php -h
Das bitte mit <enter> (wir erinnern uns, die große Taste rechts) bestätigen.

Unsere, um diese Uhrzeit schon müden Augen, werden die folgende Ausgabe sehen:
Code:
Usage: php [options] [-f] <file> [args...]
       php [options] -r <code> [args...]
       php [options] [-- args...]
  -a               Run interactively
  -c <path>|<file> Look for php.ini file in this directory
  -n               No php.ini file will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse <file>.
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -r <code>        Run PHP <code> without using script tags <?..?>
  -s               Display colour syntax highlighted source.
  -v               Version number
  -w               Display source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

  args...          Arguments passed to script. Use -- args when first argument
                   starts with - or script is read from stdin
Aus diesem Wust an Informationen entnehmen wir mal
Code:
 -f <file>        Parse <file>.
Jetzt wird das richtig spannend, gell?

Bevor wir außer Atem kommen, ein kleines Resumé des bereits Erlernten.
  1. PHP Binary finden
  2. Ein PHP-File parsen (zumindest theoretisch!)
Bevor wir uns jetzt mit wahnnsinns Geschwindigkeit einer Lösung nähern, wollen wir uns nochmal kurz die Cron anschauen. Wie ragey bereits festgestellt hat, ist das kein Wunschlosglücklich Apparat, der mit GET, SHOW, POST relativ wenig anfangen kann, denn der möchte Bash-Syntax sehen - "Oooooh nein, Console... ich kann keine Maus benutzen und alles ist so schwarz/weiß (manchmal bunt) und trotzdem so triste" - aber keine Angst meine treuen Ritter, wir werden uns durch das Dickicht der schwarz/weißen Consolenwelt schlagen und ein PHP-Skript gemäß Wunsch des Administrators (Für das Protokoll und Hamachi: Wer administriert hier eigtl. gerade wen?) um jeweils die gewünschte Uhrzeit oder sogar in gewünschten Abständen ausführen lassen.

Also auf geht's zur Cron... haha, weit gefehlt! Nein, erstmal wollen wir doch schauen, ob unser Skript geparsed wird und wir nicht etwas fürchterlich falsch machen. Also hämmern wir
Code:
php -f /path/to/our/precious/massive/enormous/world-entertaining/skript.php
in die Console und schauen mal, was da so passiert. Wenn ich das mit einer Datei namens test.php mache, die in meinem Home-Verzeichnis liegt, in der nur [highlight=PHP]<?php phpinfo(); ?>[/highlight] steht, dann kommt bei dem Aufruf
Code:
php -f ~/test.php
die bekannte PHP-Info Seite (ist jetzt jemand überrascht?), allerdings nicht in bunt, sondern - einige ahnten es bereits - in schwarz/weiß. Aber hey... es geht!

Nun wieder zurück zum Cronjob, der sehnsüchtig darauf wartet, erstellt zu werden. Die Crontab kann man tatsächlich auch mittels der Console verändern (jaha, das ist gar keine Erfindung von SWSoft!). Also tippen wir mal munter
Code:
crontab -e
in die triste Console ein. Dem folgt eine Auflistung aller bereits aktiven Cronjobs. Je nachdem, mit welchem User ihr das macht - wahrscheinlich root (ich spare mir alle Sicherheitsbelehrungen an dieser Stelle und schreibe einfach: macht das nicht mit root!) - kommen da einige mehr, oder einige weniger und ihr seid, je nachdem was die Environment-Variable EDITOR sagt, in einem Eurem heiß geliebten Editor.

Ah, was erzähle ich da... es wird wahrscheinlich vi(m) sein und die Welt geht unter! Aber nein, wir helfen Euch! Das ServerSupportForum erkennt die Not des geplagten Consolenusers und greift Euch unter die Arme.

Zuerst einmal wandert ihr mittels der Cursortaste bis in die letzte Zeile. Haargenau das machen, was in diesem Codeblock steht. Das einzige was variabel ist, ist die Zeit, wann das Skript ausgeführt werden soll. In diesem Beispiel alle 15 Min.
Code:
<o drücken>
*/15 * * * * /usr/local/php -f /full/path/to/desired/script.php
<ESC drücken>
<SHIFT + . drücken>
ZZ
<ENTER drücken>
Man verzeihe mir all den Zynismus in dieser Anleitung, aber a) wäre ein bisschen selber informieren, wie die Cron so funktioniert und b) Gehirnskasten einschalten sehr wünschenswert! Nicht zuletzt deswegen hat auf diese triviale Frage niemand von den alten Hasen geantwortet.

Sollten dem Skript Parameter übergeben werden müssen, musst Du googlen, wie das geht.
 
Last edited by a moderator:
Back
Top