Script per crontab

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich habe ein Backup Script per python, dass ich gerne 1x täglich laufen lassen würde.
    Das Script ist per shell mit "python SQLBackup.py" ausführbar und macht was es soll.

    Im Script als erste Zeile steht "#!/usr/bin/env python"

    wenn ich versuche es einfach mit "SQLBackup.py" auszuführen bekomme ich "-bash: -bash: command not found"

    woran liegt das?

    in weiterer folge würde ich gerne unter /etc/crontab folgenden Eintrag einfügen:
    0 0 * * * * pi /usr/local/smarthome/var/db/SQLBackup.py

    Reicht das oder ist sonst noch etwas notwendig?

  • Zitat

    wenn ich versuche es einfach mit "SQLBackup.py" auszuführen bekomme ich "-bash: -bash: command not found"


    Weil der aktuelle Pfad normalerweise nicht in der Umgebung steht, und so das Programm nicht gefunden wird.
    Rufe es mal mit [code]./SQLBackup.py[c/de] aus.

    (Also einen Punkt und dem Schräger über der 7)

    Zitat

    in weiterer folge würde ich gerne unter /etc/crontab folgenden Eintrag einfügen:
    0 0 * * * * pi /usr/local/smarthome/var/db/SQLBackup.py


    Wer hat den Leuten nur gesagt, dass man Crontab-Einträge in die /etc/crontab packt?

    Warum wird nicht einfach die Crontab des jeweiligen Benutzers verwendet, die nicht nur sicherstellt, dass man nur Einträge für diesen User einträgt, und keine anderen kaputt acht, und die außerdem auch keine root-Rechte braucht.

    Wenn das mit dem vollkommen unnötigen extensiven Einsatz vom "sudo" weiter so gehandhabt wird, wird es sicher auch bald 'schöne' Programme geben, die das für die Installation wollen, und den Rechner dann zu einem Mitglied vom Bot-Net machen.

    (Ja, es würde auch ohne root as Bot-Net arbeiten, aber mit kann man mehr machen)

    SUDO ist die UAC-Abfrage beim Windows. Da denkt (fast) jeder nach, ob das wirklich notwendig ist.
    Hier, beim PI wird "deSUDOt", dass einem schlecht wird.

    Computer ..... grrrrrr

  • Mit der ersten Zeile, welche mit #!<x> beginnt spezifiziert man den interpreter <x> (mit vollem Pfad), der dann das Script aufruft und abspielt, also

    Code
    #!<x>
    ....script...


    wird dann so aufgerufen:

    Code
    <x> <filename des Scripts>


    Das ist schon das ganze Geheimnis dieser sogen. she-bang zeile. DIe Raute in der ersten Zeile kennzeichnet diese als Kommentar, damit sie von Interpreter ignoriert wird. Das Ausrufezeichen ist dann die Erkennungsmarke fuer she-bang. Das funktioniert auch nur in der ersten Zeile. Der Vollstaendigkeit halber muss man das Script jetzte noch AUsfuehrbar machen mit

    Code
    chmod 750 script-filename


    Dann kann man es mit

    Code
    ./script-filename


    Aufrufen. "./" ist nötig, wenn der Pfad das aktuelle Verzeichnis nicht beinhaltet, was meistens der Fall ist.

    Wegen crontab: mach es lieber gleich richtig:
    Erstelle eine eigene Datei, ich nenne die immer "crontab-l", und schreibe die Zeile dort rein.
    Und zwarso:

    Code
    0 0 * * * *  <x> SQLBackup.py


    <x> ist dabei der vollstaendige Pfad zum python interpreter. Den bekommst Du mit

    Code
    which python

    Schliesslich noch crontab aktivieren mit

    Code
    crontab crontab-l


    fertig.

    Einmal editiert, zuletzt von wend (6. April 2017 um 07:56)

  • Danke für deine Erklärung. Das Script ist jetzt ausführbar.

    In diesem Turtorial <klick> steht man kommt mit crontab -e zum Benutzer crontab.
    Wo genau liegt dieses File bzw. wo muss es hingespeichert werden?
    ist contab-l einfach ein beliebiger Name?

    P.S.: was mir noch nicht ganz klar ist....wo kommt der vollständige Pfad der Scriptdatei hin damit ./script-filename funktioniert?

    Einmal editiert, zuletzt von fuxl66 (6. April 2017 um 08:16)

  • "crontab-l"ist ein beliebiger Filename. Der SInn dieses Namens erkennt man vielleicht so:

    Wenn ich die bereits in crontab vorhandenen Einträge nur ergaenzen will, dann mache ich folgendes:

    Code
    crontab -l > crontab-l

    So wird diese Datei immer von crontab selbst erzeugt. Die editier ich dann und checke die Aenderungen wieder ein mit

    Code
    crontab crontab-l


    Danach kann ich die Datei crontab-l auch wieder löschen. Wenn ich das vergesse und eine rumliegende cronab-l datei finde, dann weiss ich so wenigstens, was es sein soll.

    Man kann auch crontab -e verwenden. Das macht im Prinzip das gleiche. Aber wenn man die cronab-l irgendwie anderweitig erzeugen will oder in einem Revisionierungssystem verwendet (ich nehme git), oder zusammen mit einem install-script oder make, dann möchte man kein interaktives Kommando (crontab -e) verweden.
    Ansonsten ist das Tutorial von meigraf natuerlich super.

    Antwort zur letzten Frage (P.S.) : nirgends.

    Einmal editiert, zuletzt von wend (6. April 2017 um 08:26)

  • Hallo fuxl66,


    P.S.: was mir noch nicht ganz klar ist....wo kommt der vollständige Pfad der Scriptdatei hin damit ./script-filename funktioniert?


    Du kannst diesen Pfad an die Umgebungsvariable [font="Courier New"]PATH[/font] hängen, indem Du

    Code
    PATH=$PATH:/home/DeinUsername/Pfad/zu/Deinem/ausführbaren/Skript
    export PATH


    z.B. in [font="Courier New"]~/.bashrc[/font]
    einträgst.

    Und dann wird der Aufruf nicht durch

    Code
    ./skritptname

    erfolgen, sondern durch

    Code
    skriptname

    Dann steht Dir der erweiterte Systempfad (Liste der ausführbaren Dateien) nach jedem Booten und in jeder neuen Konsole zur Verfügung.


    Beste Grüße

    Andreas
    Automatisch zusammengefügt:

    Hallo wend,

    toller Beitrag in #4!

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (6. April 2017 um 08:32)

  • ok, mein erzeugtes crontab-l file ist nach
    crontab -l > crontab-l
    crontab crontab-l

    leer. ist das normal?

    Kann ich irgendwo überprüfen ob es auch wirklich gesetzt ist?

    Ich hab folgenden cron Eintrag, also testweise jede Stunde um 10 nach.
    10 * * * * /usr/bin/python /usr/local/smarthome/scripts/SQLBackup.py

    script wird nicht ausgeführt.

    Einmal editiert, zuletzt von fuxl66 (6. April 2017 um 10:14)

  • Hallo fuxl66,

    was liest Du, wenn Du

    Code
    man crontab

    eingibst?
    Was steht dort zum Parameter [font="Courier New"]-l[/font] ?

    Und was wird statt -l empfohlen?

    Funktioniert das dann?

    Und vor allem: Warum sollte in der Datei [font="Courier New"]crontab-l[/font] irgendwas drinstehen, wenn niemand was hineingeschrieben hat? Und wenn doch, was hättest Du erwartet? Dazu brauchst Du einen Raspberry Pi mit Glaskugel-Option.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • also nochmal der reihe nach....

    ich befinde mich in /usr/local/smarthome/scripts

    führe crontab -l > crontab-l aus
    es wird eine Datei im Verzeichnis erzeugt.

    Ich editiere diese
    10 * * * * /usr/bin/python /usr/local/smarthome/scripts/SQLBackup.py

    mit crontab crontab-l erhalte ich folgendes
    new crontab file is missing newline before EOF, can't install.

    Edit: Ein einfacher Zeilenumbruch löst das Problem.

    Einmal editiert, zuletzt von fuxl66 (6. April 2017 um 11:07)

  • Wenn du etwas zur crontab hinzufügst spielt es keine Rolle in welchem Verzeichnis du dich aktuell befindest.

    "crontab -l" listet die bisherigen Einträge der Crontab.
    > leitet die Ausgabe um.
    Wenn du also "crontab -l > crontab-l" ausführst wird die Ausgabe in die Datei "crontab-l" umgeleitet ... Übrigens ein ziemlich verwirrender Dateiname, schlechte Wahl. Dieser Schritt ist zudem eigentlich überflüssig. Wenn zuvor nichts in der crontab stand kann in "crontab-l" auch nichts drin stehen.
    Führt man dann "crontab crontab-l" aus wird die aktuelle crontab mit dem Inhalt der Datei "crontab-l" überschrieben.

    Wichtig ist:
    - Der Benutzer der crontab hat das Recht die Datei auszuführen. Jeder Benutzer hat seine eigene crontab.
    - Zum Script und innerhalb des Scripts absolute Pfade verwenden. Ein Absoluter Pfad beginnt mit dem Wurzelverzeichnis " / ". Absolut: /usr/local/smarthome/scripts/SQLBackup.py Relativ: SQLBackup.py. Werden im Script irgendwelche Dateien geöffnet oder geschrieben müssen dafür ebenfalls Absolute Pfade gesetzt sein.
    - Wenn die gleiche Zeile (abgesehen von den ersten 5 Spalten zum Ausführzeitpunkt) manuell nicht funktioniert, kann crontab auch nicht zaubern.

    "crontab -e" zum editieren der Crontab des aktuellen Benutzers. Zeile einfügen, speichern, beenden.

    FAQ => Nützliche Links / Linksammlung => crontab

  • Wozu den vollen Pfad zu Python wenn du schon den She-bang benutzt (was definitive die saubere Lösung ist) ;)

    Gruß Lunpepi

    --
    man ist das System-Anzeigeprogramm für die Handbuchseiten von Linux.


  • Wichtig ist:
    - Der Benutzer der crontab hat das Recht die Datei auszuführen. Jeder Benutzer hat seine eigene crontab.
    - Zum Script und innerhalb des Scripts absolute Pfade verwenden. Ein Absoluter Pfad beginnt mit dem Wurzelverzeichnis " / ". Absolut: /usr/local/smarthome/scripts/SQLBackup.py Relativ: SQLBackup.py. Werden im Script irgendwelche Dateien geöffnet oder geschrieben müssen dafür ebenfalls Absolute Pfade gesetzt sein.
    - Wenn die gleiche Zeile (abgesehen von den ersten 5 Spalten zum Ausführzeitpunkt) manuell nicht funktioniert, kann crontab auch nicht zaubern.

    "crontab -e" zum editieren der Crontab des aktuellen Benutzers. Zeile einfügen, speichern, beenden.

    FAQ => Nützliche Links / Linksammlung => crontab

    all diese Kriterien sind erfüllt.
    /usr/bin/python /usr/local/smarthome/scripts/SQLBackup.py --> erzeugt das gewünschte Backup.

    crontab -e zeigt euch meinen Eintrag
    40 * * * * /usr/bin/python /usr/local/smarthome/scripts/SQLBackup.py

    Es werden aber keine automatischen backups erzeugt.

    chmod 750 SQLBackup.py habe ich auch ausgeführt.

    wo liegt der Fehler?


  • Bitte poste den Inhalt deines Scripts.
    FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten

  • Und der Benutzer "pi" hat auch Schreibrechte im Verzeichnis /usr/local/smarthome/var/db/ ?
    Oder poste mal den EXAKTEN Befehl wie du es in crontab einträgst und wie du es manuell ausgeführt hast - mit oder ohne sudo :s

    Guck mal in die Logdatei /var/log/syslog zu dem Zeitpunkt wo crontab es hätte ausführen müssen.

    Zusätzlich könntest du noch sämtliche Ausgaben in eine eigene Logdatei schreiben lassen - um ggf Fehlermeldungen abzufangen:

    Code
    40 * * * *      /usr/bin/python /usr/local/smarthome/scripts/SQLBackup.py &> /tmp/log

  • Und der Benutzer "pi" hat auch Schreibrechte im Verzeichnis /usr/local/smarthome/var/db/ ?
    Oder poste mal den EXAKTEN Befehl wie du es in crontab einträgst und wie du es manuell ausgeführt hast - mit oder ohne sudo :s

    Guck mal in die Logdatei /var/log/syslog zu dem Zeitpunkt wo crontab es hätte ausführen müssen.

    Zusätzlich könntest du noch sämtliche Ausgaben in eine eigene Logdatei schreiben lassen - um ggf Fehlermeldungen abzufangen:

    Code
    40 * * * *      /usr/bin/python /usr/local/smarthome/scripts/SQLBackup.py &> /tmp/log

    ich habe einen weiteren User "smarthome" der den cronjob ausführen soll. mit diesem user hab ich den job auch erstellt.

    der exakte Befehl lautet (Ohne sudo): /usr/bin/python /usr/local/smarthome/scripts/SQLBackup.py

    im syslog kommt folgendes:
    Apr 6 11:50:01 smartVINO CRON[838]: (smarthome) CMD (/usr/bin/python /usr/local/smarthome/scripts/SQLBackup.py^M)
    Apr 6 11:50:01 smartVINO CRON[834]: (CRON) info (No MTA installed, discarding output)

    was ist MTA? liegt es daran?

  • Hallo fuxl66,


    was ist MTA? liegt es daran?


    MTA = Mail Transfer Agent

    Lösung durch Suche nach

    Code
    Linux (CRON) info (No MTA installed

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (6. April 2017 um 12:41)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!