• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Script funktioniert nicht als Cronjob

fuwa

Newbie
Hallo habe folgendes Skript:
Code:
#!/bin/bash
picpath=/data/intranet/dilberts

path=`curl -s "http://www.dilbert.com/" | tr [:blank:],'<','=','"' '\012' | grep "/comics/dilbert/archive/images/dilbert" | tail -n1`

file=` echo $path | tr '/' '\012' | grep ".gif" `
url=http://www.dilbert.com${path}

curl -s ${url} -o ${picpath}/${file}

filename=`date "+dilbert_%Y%m%d.gif"`

cd $picpath
rm today.gif
cp ${file} ${filename}
rm ${file}
/bin/ln -s ${filename} today.gif

chmod 644 ${filename}
Wenn ich es von "Hand" starte funktioniert es problemlos.
Wenn ich es als Cronjob laufen lasse:
Code:
0 12 * * *    /data/intranet/dilbert.sh
erhalte ich folgende Fehler:

cp: missing destination file
Try `cp --help' for more information.
rm: too few arguments
Try `rm --help' for more information.
chmod: cannot access `dilbert_20050203.gif': No such file or directory

Woran liegt dies, danke für eure Hilfe.

Gruß Markus
 
A

Anonymous

Gast
Hi,
versuch mal die Pfade einzutragen!?

zB:
type date
liefert bei mir
date is /bin/date

du solltest also zB
filename=`date "+dilbert_%Y%m%d.gif"`
durch
filename=`/bin/date "+dilbert_%Y%m%d.gif"`
ersetzen ;-)

Wenns das nicht ist reis mir nicht den Kopf ab #fg#

Mƒg ®êïñï
 

oc2pus

Ultimate Guru
es reicht wenn du in deinem Script am Anfang eine PATH-Variable definierst und exportierts, dort sollten dann alle Pfade drinstehen der Programme welche du im Script benutzt. Das spart etwa Tipparbeit ;)

PATH=/bin:/sbin/:/usr/bin/ ....
 
OP
F

fuwa

Newbie
Beide Vorschläge führen leider wieder zum gleichen Ergebnis wie vorhin. Vielleicht noch einen Tipp parat?
 
A

Anonymous

Gast
hi,
nochwas .....
macht file=` echo $path | tr '/' '\012' | grep ".gif" `
das gleiche wie file=`basename $path`
oder gibts da unterschiede ?

Mƒg ®êïñï
ist das in crontab vom root ?
also hast als root ein crontab -e gemacht ?
 
OP
F

fuwa

Newbie
Wenn ichs von Hand starte funktioniert es fehlerlos, wenn ich es aber als Cronjob laufen lasse erhalte ich zusätzlich zu den schon bekannten den folgenden Fehler:

basename: too few arguments
Try `basename --help' for more information.
 
A

Anonymous

Gast
hi,
also bei mir funktioniert es tadellos !!!
In der Form in der Du es hat, und mit file=`basename $path` !!!
Das einzige was ich natuerlich geaendert habe ist
die Variable picpath !!!
Ich kann es mir nur mehr so erklaeren :
1) du hast es nicht in der Crontab vom root
2) wenn du es als user laufen laest ( was eh gut ist ) das hatt der user nicht die noetigen rechte auf /data/intranet/dilberts ???

Mƒg ®êïñï
 
OP
F

fuwa

Newbie
Ich glaube der Fehler steckt in folgender Zeile:
path=`curl -s "http://www.dilbert.com/" | tr [:blank:],'<','=','"' '\012' | grep "/comics/dilbert/archive/images/dilbert" | tail -n1`
denn wenn ich die Variable path mit echo ausgeben möchte kommt nichts sie ist also leer.
Doch wo steck nur der Fehler?
 
A

Anonymous

Gast
Das muss aber systemspezifisch sein :(
Ich verwende ne Uralt version von RH und beim mir gehts auch tadellos aus der crontab raus !!!
æhm wenn Deine Variable path leer ist würde das bedeuten das er curl nicht ausfuehrt ... denk ich halt mal ... curl hatt bei mir den path /usr/bin ... ein versuch kann ja nicht schaden #fg#
Schau wo bei dir curl steht ( type curl ) und trag mal den pfad mit ein ;-)
path=`/usr/bin/curl -s "http://www.dilbert.com/" | tr [:blank:],'<','=','"' '\012' | grep "/comics/dilbert/archive/images/dilbert" | tail -n1`

wenns das nicht ist steh ich auch auf der Leitung :( SRY
apropos Leitung #grins#
versuch curl mit
curl -m 120 -s blabla usw.
eventuell ist dein connect ars.. ???

Mƒg ®êïñï
 
A

Anonymous

Gast
Dann tut es mir leid #sniff#
Ich weis nicht weiter .... H-I-L-F-E

Ich kann Deinen Fehler nur nach vollziehen wenn ich curl mit der Option -m 1 nur eine Sekunde zeit lasse :(
Ansonsten geht es bei mir immer !!!
Na hoffentlich probiert wer Dein Script aus, hatt den gleiche Fehler, und kann in loesen .... abwarten ;-)

Solltest Du doch noch die Loesung finden waere es ganz nett wenn Du sie posten wuerdest ;-)

Mƒg ®êïñï
 
Hallo erst mal,

ich hab ein "kleines" User Script was verschiedenste Programme überwacht und eingreift wenn nötig. Dieses Script muß als User ausgeführt werden, welches so keine Probleme macht, auch aus KCron manuell gestartet läuft es richtig aber sobald es
via Cronjob (crontab -e {user}) selbst startet kann es den Befehl dcop nicht mehr starten (datei oder befehl nicht gefunden). Ich glaube das Suse 9.2 für Cronjobs SH verwendet, ruf ich diese so auf geht dcop natürlich, super Fehler oder? Hat noch irgendjemand ne idee?? :?:

MFG BunterSalamander
 
A

Anonymous

Gast
via Cronjob (crontab -e {user}) selbst startet kann es den Befehl dcop nicht mehr starten (datei oder befehl nicht gefunden)

mit was für PATH Angaben hast du denn dein script ausgestattet.
which dcop und ldd /opt/kde3/bin/dcop zeigt auf X11 und KDE und das dürfte bei crond auf keinen Fall default im PATH sein. Eventuell sind sogar noch einige andere KDE Variablen notwendig.
versuch mal nen Rundumschlag am Anfang vom Script
Code:
export PATH=/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/opt/gnome/bin:/opt/kde3/bin:/usr/lib/java/jre/bin

robi
 
aber ich habe es erst ohne Path probiert dann ausgiebig mit,
auch direkt mit /opt/kde3/bin/dcop startet es nicht so bald das script selbst anläuft, von hand geht es super. :oops:
 
nen kleinen Ansatz hab ich schon mal,

wenn ich z.B.:
Code:
dcop | awk ....
ausführe als user klappt es problemlos, auch der aufruf
Code:
dcop > testausgabe
führt zum ergebniss, solang das script nicht selber startet!

Durch hinzufügen der User Option geht es zwar Teilweise aus dem automatisch gestarteten Script, nur das hilft mir nicht wirklich weiter.

Code:
dcop --user $user$
listet auch über User cron die optionen richtig auf, aber
Code:
dcop --user $user$ kinternet-9361 KInternetIface isOnline
sollte die Meldung true oder false zurückliefern, tut es aber nicht!

wer hat noch nen heißen Tip (bei dem kalten wetter draußen <bibber>)? :roll:
 

TeXpert

Guru
Ein anderes Problem ist, dass in der Cron-Umgebung die DCOP Umgebung nicht passt, das kannst Du ganz leicht selber rausfinden :)

einfach mal den User switchen also:
Code:
$ dcop
konsole-9099
[...]
kpowersave
andreas@sam2:/> su
Password:
sam2:/ # /opt/kde3/bin/dcop
ERROR: Couldn't attach to DCOP server!

hier sind irgendwelche ENV-Variablen noch wichtig! ich weiß nicht welche, aber Kandidaten sind KDE_FULL_SESSION und KONSOLE_DCOP und KONSOLE_DCOP_SESSION so spontan...
 
Code:
$ dcop 
konsole-9099 
[...] 
kpowersave 
andreas@sam2:/> su 
Password: 
sam2:/ # /opt/kde3/bin/dcop 
ERROR: Couldn't attach to DCOP server!

mit root gehts eh nicht ohne mehr aufwand, aber es soll nur ein User Script werden, crontab -e $user$ , was mich ja stutzig macht is die tatsache das ich mir im (automatisch von cron) gestartet script die aktiven Dcop anwendungen anzeigen lassen kann, nur sobald ich eine anweisung mache ists vorbei! Ich habe mir jetzt mal alles zu diesen thema ausgegoogelt (und teilweise gedruckt :shock: ) und werde mir damit mal ein paar nächte vertreiben... ( auch Env-variablen hab ich im visier...)

MFG BunterSalamander :D
 

TeXpert

Guru
das hat nichts mit Root/User zu tun, auch bei einem _normalen_ User also ein 'su ANDERER' wirst Du die gleiche Fehlermeldung bekommen.
 

taki

Advanced Hacker
VORSICHT: Spekulatives Halbwissen :?

Soweit ich DCOP verstehe, erlaubt es Interprozesskommunikation mit laufenden Prozessen des Benutzers. Setzt demnach mehrere Dinge voraus:

1.) Ein DCOP-Server muss in der Kennung laufen, in der der Job laufen soll. Die Applikation auf welche der Job zugreifen will, muss bereits laufen.

2.) Die Session muss beim DCOP-Server angemeldet und der Benutzer authentifiziert werden.

Dazu muss man den Cronjob wahrscheinlich bei DCOP durch einen Aufruf im Script anmelden. Der steht wahrscheinlich in der Startprozedur von KDE (/opt/kde/bin/startkde ? ).


Ich vermute allerdings, dass nur eine Session mit dem DCOP-Server kommunizieren darf. Wenn also ein Cronjob über DCOP mit einer Applikation kommunizieren will und der Anwender mit seinem Desktop angemeldet ist, wird der Cronjob wahrscheinlich nicht funktionieren. Da die Applikation ohne Desktopsession aber wohl nicht laufen wird, sieht mir das nach einem Henne / Ei Problem aus...

Wenn ichs richtig sehe, willst Du prüfen, ob schon eine Internetverbindung läuft, um die Verbindung ggf. dann aus dem Script heraus herzustellen. Das müsste auch ohne DCOP funktionieren.

Kinternet (wie qinternet) ist doch nur ein Frontend für SuSEs Konsolenscripte. Die Verbindung lässt sich auch über ifup (i)ppp0 herstellen. OT: Witzig finde ich dabei immer wieder, dass eine laufende kinternetinstanz im Systray genauso die Verbindung anzeigt, wenn man diese in der Konsole ohne den Klick aufgebaut hat...
 
den Status von Kinternet könnte ich mit nen einfachen Ping auch abfragen, aber die Steuerung anderer Anwendungen ist leider auch mit im Script drin, das Steuert so um die 10 Anwendungen. Auch evtl. beendete Apps soll es wieder starten, das mag im moment auch noch nicht ganz so wie es soll.

Der Aufruf aus dem Userscript heraus
Code:
DISPLAY=:0,0; App &
funktioniert noch nicht, auf 9.1 hats noch geklappt mit dem Script, aber ich stehe fast davor das Script noch mal neu aufzusetzen..

Aber danke für die Tipps zu DCOP, ich glaube ich weiß wie ich mich dort doppelt anmelden kann, wenn es klappt werd ich noch mal bescheid geben...

MFG BunterSalamander :lol: :oops:
 
Oben