ubuntuusers.de

crontag zündet nicht

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

thom_raindog

Avatar von thom_raindog

Anmeldungsdatum:
20. Mai 2005

Beiträge: 2848

Salue zusammen,

auf meinem Raspberry würde ich gerne jede Nacht yt-dlp mit einem bestimmten Befehl starten. Wenn ich den Befehl als normaler user in der Konsole starte, klappt alles. Also habe ich den Befehl per

1
crontab -e

als der selbe user in die crontab gepackt. Das sieht (crontab -l) aktuell so aus:

0 2 * * * yt-dlp -f "bv*+ba/b" --download-archive "/media/storage/MediaServer/Critical Role/Campaign 3/cr.archive" -o "/media/storage/MediaServer/Critical Role/Campaign 3/%(title)s.f%(format_id)s.%(ext)s" PL1tiwbzkOjQydg3QOkBLG9OYqWJ0dwlxF &> cr.log

Meine Erwartungshaltung wäre jetzt, dass jede Nacht um 2 Uhr yt-dlp anläuft und zum einen eventuelle neue Folgen herunterlädt, zum anderen etwas im "log" hinterlässt. Nichts davon passiert tatsächlich, am Dienstag eingerichtet, bis inklusive heute morgen komplette Funkstille.

Was mache ich da falsch? Wo kann ich eventuell nach weiteren Logs oder Fehlermeldungen suchen?

(Ich hoffe, ich hab das einigermaßen richtige Forum erwischt...)

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4476

Wohnort: Göttingen

Schreib vor yt-dlp mal den vollständigen Pfad.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11311

Wohnort: München

Man muss Prozent-Zeichen in Cron extra escapen, vgl. Cron (Abschnitt „date-Formate-z-B-date-Y-m-d-fuer-Dateinamen-oder-Log-Ausgaben“) - am einfachsten dürfte es sein ein Skript aufzurufen, damit hat man den Vorteil, dass man das unabhängig von cron testen kann und noch besser sind natürlich systemd/Timer Units, weil man dann eine hübsche Übersicht bekommt, wann was ausgeführt wird/wurde (systemd/Timer Units (Abschnitt „Timer-anzeigen“)).

thom_raindog

(Themenstarter)
Avatar von thom_raindog

Anmeldungsdatum:
20. Mai 2005

Beiträge: 2848

Ok, danke euch beiden. Eintrag in crontab sieht jetzt mal testweise so aus:

20 * * * * /usr/local/bin/yt-dlp -f "bv*+ba/b" --download-archive "/media/storage/MediaServer/Critical Role/Campaign 3/cr.archive" -o "/media/storage/MediaServer/Critical Role/Campaign 3/\%(title)s.f\%(format_id)s.\%(ext)s" PL1tiwbzkOjQydg3QOkBLG9OYqWJ0dwlxF &> cr.log

Damit müsste das dann ja wirklich gehen.

@seahawk1986: Ich würde also quasi eine .service anlegen, in der eigentlich der obige yt-dlp Aufruf steht, und eine .timer, die die Service-Unit dann täglich ausführt? Ich kenne .service nur um Dienste zu starten, hier wäre das ja nur ein einmaliger Aufruf... ich nehme an, das geht trotzdem?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11311

Wohnort: München

thom_raindog schrieb:

@seahawk1986: Ich würde also quasi eine .service anlegen, in der eigentlich der obige yt-dlp Aufruf steht, und eine .timer, die die Service-Unit dann täglich ausführt? Ich kenne .service nur um Dienste zu starten, hier wäre das ja nur ein einmaliger Aufruf... ich nehme an, das geht trotzdem?

Genau, du hast dann z.B. einen yt-dl.timer, der die Auführung einer yt-dl.service Service Unit triggert - und wenn der Befehl in der Unit nicht endlos läuft, sieht Systemd die Status-Änderung (man muss nur dafür sorgen, dass die richtige PID getrackt wird, wenn da so Dinge wie Forking im Spiel sind) und setzt den Status der Unit entsprechend auf gestoppt - und aus dem Zustand heraus kann sie wieder von der Timer-Unit gestartet werden. Mann kann solche Timer Units sowohl systemdweit (mit der Direktive User=benutzername kann man vorgeben, unter welchem Benutzer die ausgeführt werden sollen) als auch im Rahmen einer User-Session laufen lassen (was dann natürlich erfordert, dass der Nutzer eine laufende Session hat - vgl. systemd/User Units).

PS: Bei Systemd-Unit Dateien müssen Prozent-Zeichen verdoppelt werden, damit sie nicht als Formatierungsanweisung gesehen werden (vgl. https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers) - daher der Vorschlag ein eigenständiges Skript zu nutzen, damit man da nicht durcheinander kommt.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 10393

Wohnort: Münster

thom_raindog schrieb:

[…] Was mache ich da falsch?

Es gibt mehrere Varianten der Cron-DAEMONen, abhängig vom Betriebssystem, und diese verhalten sich leicht unterschiedlich und können auch noch unterschiedlich konfiguriert sein.

Welches Betriebssystem und welchen Cron-DAEMON verwendest Du?

Generell ist es eine schlechte Idee, speziell in den cron-Tabellen und generell in Systemdateien mit relativen Dateinamen zu arbeiten, außer man weiß genau, wie das Arbeitsverzeichnis und der Suchpfad gesetzt sind.

thom_raindog

(Themenstarter)
Avatar von thom_raindog

Anmeldungsdatum:
20. Mai 2005

Beiträge: 2848

Ok, der Weg über timer units geht wunderbar.

Danke euch allen.

Zur Dokumentation (auch für mich - und mit offenem Ohr für Feedback)

Das eigentliche Skript:

1
2
3
4
5
6
7
#!/bin/bash
# A script to download Critical Role Campaign 3 videos from YouTube using yt-dlp

date > "/media/storage/MediaServer/Critical Role/Campaign 3/cr.log"
yt-dlp -f "bv*+ba/b" --download-archive "/media/storage/MediaServer/Critical Role/Campaign 3/cr.archive" -o "/media/storage/MediaServer/Critical Role/Campaign 3/%(title)s.f%(format_id)s.%(ext)s" PL1t>

exit

cr.service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[Unit]
Description=Download CR Campaign 3 videos automatically

[Service]
Type=oneshot
ExecStart=/bin/bash /home/piserver/bin/cr.script
User=piserver

[Install]
WantedBy=multi-user.target

und cr.timer:

1
2
3
4
5
6
7
8
9
[Unit]
Description=Starts the cr.service to download new CR Campaign 3 videos automatically every night

[Timer]
OnCalendar=*-*-* 02:00:00
Unit=cr.service

[Install]
WantedBy=multi-user.target

Mir fällt direkt auf, dass ich noch den Pfad im Skript als Variable rausziehen kann, das spart zeichen. Mach ich mich nächste Woche dran 😉

Antworten |