staging.inyokaproject.org

Python und Crontab

Status: Ungelöst | Ubuntu-Version: Ubuntu 19.10 (Eoan Ermine)
Antworten |

Fraglord

Avatar von Fraglord

Anmeldungsdatum:
24. November 2007

Beiträge: 108

Hallo Leute,

Mir fehlt aktuell so ein bisschen der Einstieg in Python innerhalb eines raspberry. Kann mir jemand einen Tipp geben, wie der Code aussehen muss, damit ich über crontab folgende Dateioperationen machen kann:

a) Daten sollen per Skript von einem FTP Server (mit Login) auf die externe USB-Platte des Raspberry verschoben werden.

b) diese Daten sollen dann jeweils nach 2 Tagen gelöscht werden

Wo (in welchem Ordner) sollten diese Skripte im Optimalfall liegen?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Die Crontab ist eigentlich obsolet, Systemd/Timer Units sind die modernere Methode. Der Ordner für Skripte liegt im Ermessen des Admins, wenn man sich am FHS orientieren wollte, wäre z.B. /usr/local/bin/ ein guter Ort für Skripte und Programme, die systemweit zur Verfügung stehen sollen aber nicht aus einem Debian-Paket stammen.

Fraglord schrieb:

a) Daten sollen per Skript von einem FTP Server (mit Login) auf die externe USB-Platte des Raspberry verschoben werden.

b) diese Daten sollen dann jeweils nach 2 Tagen gelöscht werden

Fraglord

(Themenstarter)
Avatar von Fraglord

Anmeldungsdatum:
24. November 2007

Beiträge: 108

Grüß Dich seahawk1986,

vielen Dank für die vielen Links und auch deine ausführliche Antwort auf mein Anliegen.

Kann ich mit systemd auch bspw.

  • einen System Reboot jeden Sonntag 07:00 Uhr oder

  • "apt update && apt upgrade -y" jeden Montag 20 Uhr

einplanen? Das wurde mir aus den Beschreibungen noch nicht so klar, weil auch bspw. in anderen Foren auf "crontab" verwiesen wurde.

Den Tipp bezüglich /usr/local/bin/ für Skripe und Programme finde ich super. Dankeschön!

Bezüglich der Links zu den Modulbeschreibungen, habe ich mir folgenden Code zusammengebastelt. Meintest Du das so?

"Move.py"

1
2
3
4
5
6
7
import pathlib
import shutil

my_file = pathlib.Path('/usr/local/*.jpg')
to_path = pathlib.Path('/tmp/folder/')

shutil.move(str(my_file), str(to_path))

"FTP.py"

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

from ftplib import FTP

ftp = FTP('server.ip')
ftp.login(user='username', passwd='password')

ftp.cwd('/subfolder/')


def grabFile():
    
    filename = 'example.txt'

    localfile = open(filename, 'wb')
    ftp.retrbinary('RETR ' + filename, localfile.write, 1024)

    ftp.quit()
    localfile.close()
    
    
def placeFile():
    
    filename = 'exampleFile.txt'
    ftp.storbinary('STOR '+filename, open(filename, 'rb'))
    ftp.quit()

placeFile()

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Fraglord schrieb:

Kann ich mit systemd auch bspw.

  • einen System Reboot jeden Sonntag 07:00 Uhr oder

  • "apt update && apt upgrade -y" jeden Montag 20 Uhr

einplanen? Das wurde mir aus den Beschreibungen noch nicht so klar, weil auch bspw. in anderen Foren auf "crontab" verwiesen wurde.

Ja, wie so oft lohnt sich ein Blick in die Manpages:

Dein Update-Befehl könnte interaktive Abfragen erzeugen und hängen bleiben - in https://debian-handbook.info/browse/de-DE/stable/sect.automatic-upgrades.html Abschnitt 6.8.5 gibt es einen Vorschlag für eine Variante, die garantiert nicht-interaktiv läuft und daher gut automatisiert aufgerufen werden kann.

Bezüglich der Links zu den Modulbeschreibungen, habe ich mir folgenden Code zusammengebastelt. Meintest Du das so?

Das sieht nicht so aus, als ob das das alles Punkte erledigt, die du in deinem ersten Post genannt hattest.

Fraglord

(Themenstarter)
Avatar von Fraglord

Anmeldungsdatum:
24. November 2007

Beiträge: 108

Hallo seahawk1986,

nochmals Danke für Deine Bemühungen wie Tipps und Links.

In systemd muss ich mich mit Deinen Links von heute nochmal genau einlesen.

Und: Du hast Recht, mit meinem Autodelete-Skript war ich jedoch noch nicht fertig ☺ Mein autodelete.py würde aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import os
import sys
import datetime

today = datetime.datetime.now()
age = 3
req_path=input("/ftp/path")
    
for each_file in os.listdir(req_path):
    each_file_path=os.path.join(req_path,each_file)

    if os.path.isfile(each_file_path):
        file_cre_date=datetime.datetime.fromtimestamp(os.path.getctime(each_file_path))
        dif_days = (today-file_cre_date.days)
        
        if dif_days > age:
            #print(each_file_path, dif_days)
            os.remove(each_file_path, dif_days)

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Fraglord schrieb:

Und: Du hast Recht, mit meinem Autodelete-Skript war ich jedoch noch nicht fertig ☺ Mein autodelete.py würde aussehen:

Ist das nicht eine recht ausführliche Form für dieses?

1
find /ftp/path -type f -mtime +3 -delete

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

rklm schrieb:

Ist das nicht eine recht ausführliche Form für dieses?

1
find /ftp/path -type f -mtime +3 -delete

Nicht ganz, die mtime ist ja etwas anderes als die ctime und beides ist nicht zwangsläufig das, was der TE erwartet - die beiden Zeitstempel spiegeln die letzte Änderung am Dateiinhalt bzw. Inode wieder (http://linux-club.de/wiki/opensuse/Zeitstempel_von_Dateien#Modify_Time_.28mtime.29 f.).

Es gibt recht neu (ab dem Kernel 4.11) statx(), mit dem man das Erstellungsdatum wie in torvalds/linux/blob/master/samples/vfs/test-statx.c gezeigt ermitteln kann. Neuere glibc-Versionen (>=2.28) bieten dafür auch ein Interface, so dass man nicht über syscall() gehen muss. Leider kann man das noch nicht bequem aus den üblichen Python-Modulen wie os oder pathlib heraus nutzen und die ganzen Standard-CLI Tools in Linux können das auch noch nicht auswerten...

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

seahawk1986 schrieb:

rklm schrieb:

Ist das nicht eine recht ausführliche Form für dieses?

1
find /ftp/path -type f -mtime +3 -delete

Nicht ganz, die mtime ist ja etwas anderes als die ctime

Naja, das ist einfach repariert

1
find /ftp/path -type f -ctime +3 -delete
Antworten |