staging.inyokaproject.org

wget in als cronjob ausführen funktioniert nicht

Status: Gelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

claus56

Anmeldungsdatum:
24. Dezember 2019

Beiträge: 172

Hallo, ich habe versucht über einen cronjob wget auszuführen und den heruntergeladenen file in ein Verzeichnis zu schreiben. Leider funktioniert wget nicht. Was mache ich da falsch? Letztendlich möchte ich ein shell skript in der crontab ausführen das u.a. auch wget ausführt. Zum testen habe ich aber erst mal den wget Befehl direkt mit crontab -e angegeben. Der cronjob wird als "normaler" user (nicht root) ausgeführt. Für einen Tipp wäre ich sehr dankbar.

@reboot wget https://opendata.dwd.de/weather/local_forecasts/mos/MOSMIX_L/single_stations/K984/kml/MOSMIX_L_LATEST_K984.kmz -O /home/claus/MOSMIX_L_LATEST_K984.kmz

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Ich würde dir empfehlen dafür systemd/User Units zu benutzen. Diese kannst du dann erst starten lassen, nachdem das network-online.target erreicht ist, also die Netzwerkverbindung steht. Falls das regelmäßig aktualisieren soll, kannst du auch einen systemd/Timer Units für diese Unit starten, anstatt sie zu aktivieren und hast gleich ein regelmäßiges Update integriert.

Einfaches Beispiel für Timer und Unit ohne Abhängigkeiten (systemweit):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# /etc/systemd/system/twoMinuteTimer.timer
[Unit]
Description=Startet alle 2 Minuten, das erste mal 4 Minuten nach reboot

[Timer]
OnBootSec=240
OnUnitActiveSec=120
Unit=MyService.service

[Install]
WantedBy=timers.target
1
2
3
4
5
6
7
8
# /etc/systemd/system/MyService.service
[Unit]
Description=Wird vom Timer ausgeführt!

[Service]
User=servicenutzer
Group=servicenutzer
ExecStart=/home/servicenutzer/.local/bin/myservicescript.bash

Das ist allerdings eine systemweite Einrichtung, die unabhängig davon läuft, ob dein Nutzer angemeldet ist oder nicht, als kleine Alternative zu den User-Units (die ich am Desktop bevorzugen würde). Ausgeführt werden die Units von root, aber das Script unter dem Benutzer servicenutzer.

Falls du das unbedingt per cron machen willst, musst du dir eine Warte-Schleife scripten, die prüft, ob der Netzwerkzugang besteht und danach erst wget ausführen.

claus56

(Themenstarter)

Anmeldungsdatum:
24. Dezember 2019

Beiträge: 172

Hallo ChickenLipsRfun2eat, vielen Dank für die schnelle Antwort. Mit User Unit habe ich mich noch gar nicht befasst. Das werde ich jetzt nachholen und Dein Lösungsvorschlag ausprobieren. Viele Grüße Claus

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Der Systemd-Unit müsste man auch eine Abhängigkeit zum network-online.target geben - wobei das in Verbindung mit dem NetworkManager unter Ubuntu Standardmäßig nicht ganz so funktioniert, wie man sich das vorstellt - da muss man nacharbeiten - vgl. https://blog.agchapman.com/auto-mounting-network-file-systems-with-systemd/

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Guter Hinweis mit dem NetworkManager!

Dann wäre eventuell das einfacher: NetworkManager/Dispatcher. Reagiert auch auf unterschiedliche Verbindungen anders, wenn du möchtest.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Hast Du in die Logfiles geschaut, ob da eine Fehlermeldung steht?

1
journalctl | grep cron

Sonst wäre das auch mein erster Verdacht, dass der Befehl läuft, bevor das Netzwerk da ist.

Alternative Lösung zu systemd-timer: aus der Crontab ein Skript starten, und im Script entweder auf Netzwerk prüfen, was etwas aufwendiger aber sicherer ist, oder eine Wartezeit vor dem wget-Befehl abwarten, die man experimentell eingrenzen kann, die in 95%, 99,5% oder 99,995% der Fälle ausreicht, insbesondere, wenn man das Ergebnis selten dringend kurz nach dem Reboot benötigt.

claus56

(Themenstarter)

Anmeldungsdatum:
24. Dezember 2019

Beiträge: 172

ich habe ein skript in dem erst mal einige files gelöscht werden und dann der wget Befehl ausgeführt wird. In der crontab steht am Ende

@reboot echo `date`>> log.log

was auch immer sauber ausgeführt wird. Am einfachsten wäre eine Warteschleife einzubauen und dann wget zu starten - werde ich ausprobieren. Aber die Idee mit den user unit finde ich auch interessant und werde es auch testen. Das journalctl sieht ganz okay aus.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

claus56 schrieb:

ich habe ein skript in dem erst mal einige files gelöscht werden und dann der wget Befehl ausgeführt wird. In der crontab steht am Ende

@reboot echo `date`>> log.log

Backticks sind deprecated und sollten zugunsten von $(BEFEHL) aufgegeben werdenn - das ist portabler, besser zu schachteln und besser zu lesen.

Hier ist aber das ganze Konstrukt mit "echo" von hinten durch den Rücken:

@reboot date >> log.log

tut es doch auch.

was auch immer sauber ausgeführt wird. Am einfachsten wäre eine Warteschleife einzubauen und dann wget zu starten - werde ich ausprobieren. Aber die Idee mit den user unit finde ich auch interessant und werde es auch testen. Das journalctl sieht ganz okay aus.

claus56

(Themenstarter)

Anmeldungsdatum:
24. Dezember 2019

Beiträge: 172

Backticks sind deprecated und sollten zugunsten von $(BEFEHL) aufgegeben werdenn - das ist portabler, besser zu schachteln und besser zu lesen.

Du hast recht. Bin halt noch von der alten Unix Schule und betreibe die Computerei jetzt im Alter nur noch als Hobby. Aber wenn ich was dazulernen kann bin ich happy.

claus56

(Themenstarter)

Anmeldungsdatum:
24. Dezember 2019

Beiträge: 172

Vielen Dank euch allen für die Hilfe. Die einfache Lösung mit der Warteschleife funktioniert einwandfrei. Bei der Umsetzung mit den User Units bin ich noch dran. Gruß Claus

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

Ich habe da noch ein anderes Skript, das ich beim Hochfahren laufen lasse:

1
2
3
4
5
6
#!/bin/bash
until wget --spider -q https://die.seite.auf.die.ich.will.com
do
sleep 3
done
/home/user/skript-mit-dem-eigentlichen-wget-befehl-zum-download.sh

Das hat bis jetzt fehlerfrei funktioniert.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

wxpte schrieb:

Ich habe da noch ein anderes Skript, das ich beim Hochfahren laufen lasse:

1
2
3
4
5
6
#!/bin/bash
until wget --spider -q https://die.seite.auf.die.ich.will.com
do
sleep 3
done
/home/user/skript-mit-dem-eigentlichen-wget-befehl-zum-download.sh

Das hat bis jetzt fehlerfrei funktioniert.

Der eigentliche Download kann immer noch scheitern. Meistens ist es nutzlos erst zu fragen, ob eine Operation erfolgreich sein wird, weil sich das meist jederzeit ändern kann. Warum nicht einfach den eigentlichen Download in die Schleife packen?

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

Stimmt, im Grunde kann man den Download auch direkt in die Schleife integrieren. Bei mir handelte es sich um den Fall, dass das Skript ein ganzes Bündel an Downloads enthält (je nach Fall 10 bis 12), die eigentlich sehr zuverlässig laufen. Nur einmal habe ich es geschafft, mich so schnell anzumelden, dass die Netzwerkverbindung noch nicht fertig aufgebaut war, als das Downloadskript schon loslief. Das wget --spider soll also eigentlich nur prüfen, ob die Netzwerkverbindung steht.

Seit ich die Schleife verwende, sind alle Downloads erfolgreich gewesen.

Antworten |