python3 rsync cronjob

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ganja
User
Beiträge: 136
Registriert: Mittwoch 3. Dezember 2014, 07:44

Samstag 16. Januar 2021, 07:35

Hallo,
ich versuche vergeblich im cronjob rsync als python3 code zu erstellen, wenn ich es manuel ausführe passt alles und rsync läuft, im cronjob aber wird der befehl nicht ausgeführt, nach meiner recherche müsste ich irgendwie eine pseudo shell starten da rsync das braucht, ich weiß leider nicht wie das geht, wenn ich ssh hätte wäre das kein problem mit -t, aber leider kein ssh zu verfügung.
Hat einer schon mal das Problem gehabt? Hat einer einen Tipp wie ich das Problem lösen kann? Ich dachte shell=True reicht, leider ist dem nicht so.
Ich hoffe jemand hat eine Idee wie ich das im cronjob zu laufen bekomme.
Ich bedanke mich im Voraus.

Code: Alles auswählen

subprocess.Popen('rsync -arv --files-from=xxx.txt --exclude=*.txt,*.csv rsync://xxxx@xxx.xxx.xxx.xxx/xxxx/ /home/xxxxxx/xxxxx --password-file=/xxx/rsyncd.secrets --log-file=/home/xxxxx/logs/$(date +%Y_%m_%d_%H:%M)_mylog.log', stdin=PIPE, shell=True)
Benutzeravatar
__blackjack__
User
Beiträge: 8104
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 16. Januar 2021, 10:59

@ganja: Du verrätst ja leider nicht wie Du den cronjob definiert hast und was dann in der Logdatei steht wenn der Job versucht wird auszuführen. So kann man jetzt nur raten woran es liegen könnte.

Ich rate mal, dass das Arbeitsverzeichnis nicht das erwartete ist und deshalb die `xxx.txt` nicht gefunden wird.

Was meinst Du mit „pseudo shell“? Eine extra Shell startest Du ja. Wobei ich da zum Beispiel fragen würde ob Du die tatsächlich brauchst. So wie es aussieht nur für das ``$(date +…)``, aber *das* kann man auch in Python erledigen, da braucht man nicht extra eine Shell zwischen das eigene Programm und ``rsync`` zu setzen.

Warum biegst Du die Standardeingabe auf Dein Programm um?

Code: Alles auswählen

#!/usr/bin/env python3
import subprocess
from datetime import datetime as DateTime

...

    subprocess.run(
        "rsync",
        "-arv",
        "--files-from",
        "xxx.txt",
        "--exclude",
        "*.txt,*.csv",
        "rsync://xxxx@xxx.xxx.xxx.xxx/xxxx/",
        "/home/xxxxxx/xxxxx",
        "--password-file",
        "/xxx/rsyncd.secrets",
        "--log-file",
        f"/home/xxxxx/logs/{DateTime.now():%Y_%m_%d_%H:%M})_synclog.log",
        check=True,
    )
“Unfortunately forty years of programming experience has taught me that there's an essentially infinite supply of mistakes to make … your mistakes just get smarter most of the time.” — Steve Holden
ganja
User
Beiträge: 136
Registriert: Mittwoch 3. Dezember 2014, 07:44

Samstag 16. Januar 2021, 14:15

Hallo @_Blackjack_, dein bsp und mein bsp, funktionieren wenn ich es in der shell eingebe manuell, wenn ich es im cronjob habe passiert nichts, rsync braucht eine shell warum auch immer, mit subprcess.run kam am Fr Fehler Meldung < --files-from=xxx.txt > findet xxx.txt nicht, kann aber nicht sein liegt im gleichem Verzeichnis, mit subrozess.call kam keine Fehler job wurde nicht ausgeführt, ich werde mal heute Abend den bsp testen, und gebe bescheid. Im Script habe ich nach dem rsync Befehl was anderes noch da würd dann das andere gemacht, der Befehl subprocess.xxx(rsync...) würd einfach übersprungen, ich teste es mal und melde mich.
Danke für den Tipp erstmal, alles zu trennen mit "" habe ich nicht versucht.
Sirius3
User
Beiträge: 13908
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 16. Januar 2021, 14:23

Nein, rsync braucht keine shell, Du hast irgendwo anders einen Fehler. Einen Grund hatte ja __blackjack__ schon genannt: Du befindest Dich nicht in dem Verzeichnis, wo Du denkst.
Und dass Du keinen Fehler gesehen hast, liegt einfach daran, dass Du das Programm ausgeführt hast und alle Fehler ignorierst. Das kann Dir mit subprocess.run und check=True nicht passieren.
ganja
User
Beiträge: 136
Registriert: Mittwoch 3. Dezember 2014, 07:44

Sonntag 17. Januar 2021, 09:13

Guten morgen,
@_blackjack_, ich möchte keine Standardeingabe haben, ich möchte das script im crinjob aufrufen und es soll seine arbeit erledigen ohne interaktion mit mir ;).
Ich habe dein bsp. versucht leider geht es nicht jetzt bekomme ich folgende Fehlermeldung:

File "./scriptrsync.py", line 31, in <module>
subprocess.run(
File "/usr/lib/python3.8/subprocess.py", line 489, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.8/subprocess.py", line 753, in __init__
raise TypeError("bufsize must be an integer")
TypeError: bufsize must be an integer

line 31 subprocess.run(

--files-from=xxxx.txt habe ich geändert in
ordner=['xxxx','xxxxx','xxxxxx'] und übergebe es dann mit "ordner".
Wie gesagt mein versuch funktioniert wenn ich es manuell starte mit ./scriptrsync.py in der shell, es funktioniert ohne fehler, das möchte ich aber nicht ich möchte es im cronjob, und dann soll das script vom cronjob aufgerufen werden die ordner synchronisieren, ohne das eine interaktion notwendig ist, das will nicht.

@Sirius, das habe ich im netz gefunden gelesen, rsync-daemen würde pseudo shell brauchen, vielleicht habe ich etwas falsch verstanden. Und zu 10000% befende ich mich in dem gleichem verzeichnis
Sirius3
User
Beiträge: 13908
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 17. Januar 2021, 09:29

In __blackjack__s Beispiel fehlen einfach nur Filter eckigen Klammern.

Code: Alles auswählen

    files_from = "xxx.txt"
    source = "rsync://xxxx@xxx.xxx.xxx.xxx/xxxx/"
    target = "/home/xxxxxx/xxxxx"
    password_file = "/xxx/rsyncd.secrets"
    log_filename = f"/home/xxxxx/logs/{DateTime.now():%Y_%m_%d_%H:%M})_synclog.log"
    subprocess.run([
        "rsync",
        "-arv",
        "--files-from", files_from,
        "--exclude", "*.txt,*.csv",
        source,
        target,
        "--password-file", password_file,
        "--log-file", log_filename],
        check=True,
    )
Und was du glaubst ist unerheblich, solange eine Fehlermeldung etwas anderes sagt.
nezzcarth
User
Beiträge: 1235
Registriert: Samstag 16. April 2011, 12:47

Sonntag 17. Januar 2021, 09:54

Noch mal die Frage: Welche Fehlermeldung liefert denn Cron, wenn er versucht, das Skript auszuführen? Wie die anderen schon meinten: Skripte, die von Cron ausgeführt werden, laufen unter anderen Bedingungen als Skripte, die du aus einer interaktiven Shell heraus ausführst. Und das ist in den meisten Fällen wenn ein Skript, das eigentlich funktioniert, es per Cron nicht plötzlich nicht mehr tut, die Fehlerquelle. Prüfe, ob das Skript mit den richtigen Berechtigungen ausgeführt wird, ob absolute Pfade verwendet werden usw.

Mir ist nicht klar, warum rsyncd ein pseudo-tty brauchen sollte; hast du dazu eine Quelle?
ganja
User
Beiträge: 136
Registriert: Mittwoch 3. Dezember 2014, 07:44

Sonntag 17. Januar 2021, 11:38

Hallo @nezzcarth, ich werde dein bsp. mal testen, und gebe bescheid, Skripte werden als root ausgeführt, cron meldet nichts überspringt einfach den subpprocess.run(rsync, also mein bsp dass ich gepostet habe.
Mit eckigen [] habe ich es auch schon versucht das bsp von @_blackjack_, hat leider auch nicht funktioniert.
Danke nochmal, ich habe irgendwo die links gespeichert mit dem tty, ich werde nochmal suchen
Sirius3
User
Beiträge: 13908
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 17. Januar 2021, 11:56

"nicht funktioniert" ist eine schlechte Fehlerbeschreibung. Was meldet denn der Cronjob? Dass einfach was übersprungen wird, kann nicht sein, denn zum einen steht da check=True, das heißt, dass das Programm mit einer Fehlermeldung abbricht, wenn rsync einen Fehler meldet, zum anderen hast Du bei rsync -v angegeben, dass auch dort ausführliche Meldungen kommen.
Es sei denn, Du ignorierst irgendwo anders absichtlich alle Meldungen. Also solltest Du erst einmal alles so schreiben, dass Du die Ausgabe auch zu Gesicht bekommst.
__deets__
User
Beiträge: 9378
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 17. Januar 2021, 12:04

Der einzige Grund, ein Kontrollterminal zu benutzen, laege in der Eingabe des Passworts. Das sollte man aber tunlichst nicht im Klartext in eine Datei schreiben, sondern stattdessen mit SSH-Key Authentication arbeiten.
ganja
User
Beiträge: 136
Registriert: Mittwoch 3. Dezember 2014, 07:44

Sonntag 17. Januar 2021, 12:33

Läuft, läuft, läuft.

Danke Danke Danke Danke Danke

Danke @_blackjack_
Danke @Sirius
Danke @nezzcarth
Danke @__deets__

@__deets__ du hast recht, aber mir steht kein ssh zu verfügugung.

VIELEN DANK Jungs Danke
Antworten