PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Script arbeitet von shell aus ok, aber nicht per cronjob



Navy2k
20-09-2004, 18:23
Hallo erstmal,

ich habe folgendes Problem:

Per Script hole ich mir die aktuelle IP und wenn sich Diese bei einem weiteren
Aufruf des Scripts ändert wird ein Programm namens updatedd gestartet das
die neue IP bei dyndns registriert.

Von einer console aus läuft das einwandfrei, nur wenn ich das ganze in meine
crontab eintrage ("*/5 * * * * /blablub/myipscript") wird das Script noch
gestartet, aber dann erhalte ich statt "IP erfolgreich aktualisiert", folgende
Fehlermeldung: "Try `updatedd --help' for more information.", mehr nicht.

Muss ich in meinem script beim Aufruf von updatedd etwas beachten?
zZ liegt es einfach in einem else Pfad einer if Abfrage:
else updatedd dyndns MYUSER:MYPASS MYHOST;

Wäre nett wenn mir jemand helfen könnte.
mfg Navy

TheDodger
20-09-2004, 18:47
Gibt es bei updatedd vielleicht eine --verbose option, damit man etwas mehr vom ursprünglichen Fehler sieht?

Navy2k
20-09-2004, 21:06
Nein, zumindest keine dokumentierte. Gibt es ne möglichkeit zu definieren das
updatedd dyndns MYUSER:MYPASS MYHOST ein zusammenhängender Befehl ist?
Wenn ich nur updatedd ohne Paramater starte bekomme ich die selbe Fehlermeldung.

peschmae
20-09-2004, 21:39
Poste doch mal das Script.

Der Hauptunterschied der oft Probleme macht zwischen "normal Ausführen" und Cronjob ist dass beim Cronjob die PATH-Variable nicht gesetzt ist - d.h. du verwendest absolute Pfade zu den Programmen oder setzt die Variable am Scriptanfang selber.

Allerdings verstehe ich die Fehlermeldung so auch nicht.

MfG Peschmä

Navy2k
20-09-2004, 21:54
Hm Pfadangaben teste ich schnell mal aber moment das Programm findet er ja :confused:

Hier mal das script:

#!/bin/sh
wget -q http://checkip.dyndns.org/index.html --output-document=/root/bin/neu.ip --timeout=3
if [ "`cat /root/bin/neu.ip`" = "`cat /root/bin/alt.ip`" ]
then echo No new IP;
else updatedd dyndns USER:PASS HOST; echo "New IP";
fi
rm /root/bin/alt.ip
mv /root/bin/neu.ip /root/bin/alt.ip

Bin grad auch noch am feilen um die ganzen file Operationen gegen Parameter
zu ersetzen, aber primär jetzt mal das updatedd im cron ans laufen zu kriegen.

Navy2k
23-09-2004, 03:34
:mad: Ich könnt sowas von kotzen, ich hab jetzt hier eine Woche mit diesem
miniscript verschissen und jetzt gehts nur weil ich #!/bin/bash verwende
anstatt #!/bin/sh . *argh*

Hoffe es hilft wenigstens jemand anderem der ein ähnliches Problem hat.

mfg Navy

peschmae
23-09-2004, 07:01
Aber /bin/sh ist bei mir zumindest ein Symlink auf /bin/bash :confused:

Oder liegts eventuell gerade daran? Dass Cron keine Programme via Symlinks starten will?

MfG Peschmä

fs111
23-09-2004, 08:32
Aber /bin/sh ist bei mir zumindest ein Symlink auf /bin/bash :confused:
MfG Peschmä

Das ist aber nur unter Linux so, andere Unices haben da die echte Bourne Shell.

fs111

roli
23-09-2004, 08:38
Programme mit Cron via Symlink starten klappt bei mir jedenfalls Bestens...

Roli

peschmae
23-09-2004, 19:44
Das ist aber nur unter Linux so, andere Unices haben da die echte Bourne Shell.

Ich weiss, das war auch nicht "da point" von dem Satz ;)

Danke@Roli :)

MfG Peschmä

Hans-Georg Normann
23-09-2004, 20:11
gibt da so einiges was man machen könnte.

set -xv in das script einbauen. Damit erhält man eine Ablaufverfolgung. Läuft sowohl in der bash als auch in der sh. Hier mal ein Beispielscript:

echo $(date); sleep 1;
echo $(date); sleep 1;
set -xv
echo $(date); sleep 1;
echo $(date); sleep 1;
echo $(date); sleep 1; Hier kommt die Ausgabe:
[hans@rosi tmp]$ ./xyz.sh
Do Sep 23 21:07:37 CEST 2004
Do Sep 23 21:07:38 CEST 2004
echo $(date); sleep 1;
date
+++ date
++ echo Do Sep 23 21:07:39 CEST 2004
Do Sep 23 21:07:39 CEST 2004
++ sleep 1
echo $(date); sleep 1;
date
+++ date
++ echo Do Sep 23 21:07:40 CEST 2004
Do Sep 23 21:07:40 CEST 2004
++ sleep 1
echo $(date); sleep 1;
date
+++ date
++ echo Do Sep 23 21:07:41 CEST 2004
Do Sep 23 21:07:41 CEST 2004
++ sleep 1
[hans@rosi tmp]$
Wenn du die Standardausgabe nicht ins Nirwana schickst, dann bekommst du eine Mail von der cron.

set > /tmp/irgendwas.txt

Listet alle Variablen in der Datei /tmp/irgendwas.txt. Da sieht man dann was in der cron fehlt.

Hans

Navy2k
24-09-2004, 17:52
hm war nicht die Shell sondern der absolute Pfad auf updatedd die ich
gleichzeitig ins Script eingefügt habe. Aber warum läuft das Script dann wenn
ich es aus der Shell aufrufe aber nicht wenn cron es aufruft ?

*grübel*
in "PATH=" ist der pfad in dem updatedd liegt enthalten

Hier jetzt das script das funktioniert:

#!/bin/bash
wget -q http://checkip.dyndns.org/index.html --output-document=/root/bin/neu.ip
IP=`cat /root/bin/neu.ip|grep ^'<html>'|sed 's/[^0-9.]//g'`
echo $IP > neu.ip
if [ $IP = `cat /root/bin/alt.ip` ]
then nothing=0;
else /usr/local/bin/updatedd dyndns -- -4 $IP USER:PASS HOST; echo "Neue IP = " $IP
fi
mv /root/bin/neu.ip /root/bin/alt.ip

Hans-Georg Normann
24-09-2004, 22:44
Einige Anmerkungen zu deinem Script sollten erlaubt sein:

Auch wenn es nur ein sehr kleines Script ist, ein bisschen Struktur kann nicht schaden.
Am Besten die Pfade immer als erstes im Script als Variable anlegen. Das erleichtert die Pflegbarkeit des Codes.
Kommentare sollten auch immer vorhanden sein. Aus Gründen der Übersichtlichkeit habe ich hier aber auch darauf verzichtet.
Was passiert, wenn $WORKDIR/alt.ip nicht vorhanden ist? Bei mir führte das zu einem Fehler. Deshalb habe ich die Datei, wenn nicht vorhanden mit 0.0.0.0 initialisiert.
Nach soviel Gesabber bekommst du natürlich auch das modifizierte Script zu sehen.

#!/bin/bash

WORKDIR=/etc #oder was auch immer
UPDATEDD=/usr/local/bin/updatedd

## edit 27.09.2004 checkip.dydns.org erreichbar?
ping -c 1 checkip.dyndns.org >/dev/null || exit
## end edit

wget -q http://checkip.dyndns.org/index.html --output-document=$WORKDIR/neu.ip
IP=`cat $WORKDIR/neu.ip|grep ^'<html>'|sed 's/[^0-9.]//g'`
echo $IP > $WORKDIR/neu.ip

if [ ! -f $WORKDIR/alt.ip ]; then
echo "0.0.0.0" > $WORKDIR/alt.ip
fi

if [ $IP != $(cat $WORKDIR/alt.ip) ]; then
$UPDATEDD dyndns -- -4 $IP USER:PASS HOST
echo "Neue IP = " $IP
fi

mv $WORKDIR/neu.ip $WORKDIR/alt.ip

Viel Spaß damit

Hans

Navy2k
27-09-2004, 00:14
Hi,

danke für deine gut gemeinten Tips. Das was ich gepostet habe war aber auch
nicht das endgültige Script. Wenn man hald gestresst ist wegen einem Fehler
der nicht klar ersichtlich ist und 3-4 mal ganz neu anfängt (ursprünglich wollte
ich auch die IP Adresse von meinem Router abholen) leidet die Struktur hald etwas ;)
Ach und ich seh grad das Forum hat das letzte bischen Struktur in der Abfrage
auch noch gekillt. :D

Ne kleinigkeit hast du aber auch übersehen, wenn keine Verbindung zu
http://checkip.dyndns.org/index.html besteht.

Muss dir aber ich grossen und ganzen Recht geben das mein gepostetes Script
übell aussieht :o


mfg Navy

marce
27-09-2004, 08:37
hm war nicht die Shell sondern der absolute Pfad auf updatedd die ich
gleichzeitig ins Script eingefügt habe. Aber warum läuft das Script dann wenn
ich es aus der Shell aufrufe aber nicht wenn cron es aufruft ?

*grübel*
in "PATH=" ist der pfad in dem updatedd liegt enthalten



in Deinem PATH schon, aber vermutlich nicht in dem PATH von cron.


zur Not einfach mal ein Script per Cron starten, dass den Path in eine Datei schreibt. Ist meist nur /usr/bin und /bin - und wenn Dein aufgerufenes Prg da nicht drin liegt iss' Essig ;-)

Hans-Georg Normann
27-09-2004, 22:42
Ne kleinigkeit hast du aber auch übersehen, wenn keine Verbindung zu
http://checkip.dyndns.org/index.html besteht.Habe das mal nachgetragen.

Hans

Navy2k
28-09-2004, 03:14
Hi marce,

hier mal meine crontab:

SHELL=/bin/bash
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin:/usr/local/bin
MAILTO=root
#
# check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
#
-*/15 * * * * root test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1
59 * * * * root rm -f /var/spool/cron/lastrun/cron.hourly
14 4 * * * root rm -f /var/spool/cron/lastrun/cron.daily
29 4 * * 6 root rm -f /var/spool/cron/lastrun/cron.weekly
44 4 1 * * root rm -f /var/spool/cron/lastrun/cron.monthly
*/5 * * * * root /root/bin/ipupdate

updatedd liegt im /usr/local/bin und alle dateien die vom Script erstellt
werden in /tmp

Also ganz verstehe ich noch nicht warum updatedd nur mit absoluten Pfaden
läuft.

mfg Navy

@Hans Georg Das mit dem Ping is ne gute Idee mal schaun was mir besser gefällt
zZ überprüfe ich ob alt.ip leer ist.

Hans-Georg Normann
28-09-2004, 19:20
Hattest du meinen Vorschlag set > /tmp/iregndwas.txt in dein Script einzubauen einmal ausprobiert? Wenn in der Datei PATH nicht PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin:/usr/local/bin ist, dann ist der Path aus der cron wohl nicht exportiert worden.

Alternativ könntest du doch ein
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin:/usr/local/bin
EXPORT PATH in das Script einbauen

Hans

Navy2k
28-09-2004, 20:14
Ja hab ich.

Es wird alles richtig aufgelöst aber dann bekomm ich diese ominöse, nichtssagende
Fehlermeldung

updatedd dyndns -- -4 (hier wird die aktuelle IP eingefügt) 'USER:PASS' HOST
Try `updatedd --help' for more information.

:confused:

mfg Navy

Blackhawk
01-10-2004, 09:17
das bedeutet, das du die syntax nicht eingehalten hast. Evt. ist also eine Variable noch leer...

Navy2k
03-10-2004, 01:25
Aber wenn ich mit "set -xv" überprüfe was der shell übergeben wird stimmt die syntax incl allen Variablen.

mfg Navy

Romanday
03-10-2004, 10:12
Definiere den Path in deinem Script readonly.
Mach am Anfang deines Scriptes -> cd Path.

Und dann sollte es funktionieren.

Navy2k
10-10-2004, 02:46
Warum sollte ich per cd in den Pfad gehen ? Ein absoluter Aufruf erscheint mir
sinnvoller und übersichtlicher.

Was mir noch eingefallen ist mit welchen Rechten und Umgebungsvariablen
startet cron die angegebenen Programme?

Hans-Georg Normann
10-10-2004, 22:19
Was mir noch eingefallen ist mit welchen Rechten und Umgebungsvariablen
startet cron die angegebenen Programme?Nanu, ich dachte, das wäre erledigt :rolleyes: Das set > /tmp/iregndwas.txt gilt immer noch. Dann kannst du dir sämtliche Variablen im vi oder deinem Lieblingseditor ansehen.

Hans