it-swarm.com.de

Cron führt nur den ersten Teil des Skripts aus

Dies ist das Skript, das ich benutze:

find /path/backups/ -type f -mtime -2 -printf '%P\n' | rsync -avz --progress --delete --exclude-from=- -e "ssh -p 512" /path/backups/ [email protected]:/remote/path/server-backups/

Dies ist aus dem Protokoll:

> Jan 21 15:32:01 servername CRON[14654]: (serveruser) CMD (find /path/backups/ -type f -mtime -2 -printf ')

Ich habe versucht, cron.d, crontab -e und cron.daily. Sowohl das direkte Einfügen des Skripts in die crontab -Datei als auch das Aufrufen eines .sh Skriptdatei. Irgendwelche Ideen, wie ich das lösen könnte?

2
Ayys

Der Befehl wird abgeschnitten, weil % In cron eine besondere Bedeutung hat. Von man 5 crontab:

   The ``sixth'' field (the rest of the line) specifies the command to  be
   run.   The  entire  command  portion  of the line, up to a newline or %
   character, will be executed by /bin/sh or by the Shell specified in the
   Shell  variable of the crontab file.  Percent-signs (%) in the command,
   unless escaped with backslash (\), will be changed into newline charac‐
   ters,  and  all  data  after the first % will be sent to the command as
   standard input. There is no way to split a  single  command  line  onto
   multiple lines, like the Shell's trailing "\".

das erklärt, warum der protokollierte Befehl ungefähr so ​​aussieht:

CMD (find /home/steeldriver/forums/tests -type f -mtime +1 -printf ')

Um zu demonstrieren, dass die Flucht funktioniert, gilt Folgendes:

$ ls -l tests
total 12
-rw-rw-r-- 1 steeldriver steeldriver  0 Jan 22 14:22 A8eVAmK.txt
-rw-rw-r-- 1 steeldriver steeldriver 22 Oct 27 22:18 A9E27.txt
-rw-rw-r-- 1 steeldriver steeldriver 10 Oct 27 22:19 ffn2eG6.txt
-rw-rw-r-- 1 steeldriver steeldriver 43 Jan 22 14:22 sBHFgkv.txt

Dann die Crontab wie folgt hinzufügen:

* * * * * find /home/steeldriver/forums/tests -type f -mtime +1 -printf '\%P\0' | rsync -0av --exclude-from=- /home/steeldriver/forums/tests/ /home/steeldriver/forums/newtests/ 2>&1 > /home/steeldriver/forums/backup.log

(Beachten Sie, dass dies die nullterminierte Form \0 verwendet.) Erzeugt die Protokolldatei:

$ cat backup.log
sending incremental file list
created directory /home/steeldriver/forums/newtests
./
A8eVAmK.txt
sBHFgkv.txt

sent 250 bytes  received 113 bytes  726.00 bytes/sec
total size is 43  speedup is 0.12

zeigt an, dass die Sicherung erfolgreich ausgeführt wurde und nur die neueren Dateien kopiert wurden:

$ ls -l newtests
total 4
-rw-rw-r-- 1 steeldriver steeldriver  0 Jan 22 14:22 A8eVAmK.txt
-rw-rw-r-- 1 steeldriver steeldriver 43 Jan 22 14:22 sBHFgkv.txt

Beachten Sie, dass Sie das Entweichen außerhalb Ihrer crontab nicht testen können - im Terminal führt dies zu einem Fehler vonfind.

3
steeldriver

Ich schlage einen alternativen Ansatz vor. Die Verwendung temporärer Dateien kann Ihnen das Leben erleichtern und hilft Ihnen dabei, Pipes zu vermeiden, die Probleme mit Cron-Jobs verursachen können.

Der Prozess hier ist ziemlich einfach. Geben Sie zuerst den Befehl aus

find ./ -daystart -mtime +2 >myfile

Hinweis:

Mit den obigen Angaben werden Dateien abgeglichen, die zwischen 2 und 3 Tagen alt sind, da ganzzahlige Tage verwendet werden. * Ändern Sie sie nach Bedarf, oder verwenden Sie -mmin und Minuten, um eine genauere Auswahl zu erzielen. Die übereinstimmenden Ergebnisse werden in die Datei myfile geschrieben, die bei jeder Ausführung des Befehls überschrieben wird.

Nächste Ausgabe des Befehls: sed 's|./||' myfile >EXCL_list, um das nicht benötigte Präfix zu entfernen. Die Datei EXCL_list wird bei jeder Ausführung des Befehls überschrieben.

Geben Sie zum Schluss den folgenden Befehl ein:

rsync -Pav --exclude-from=EXCL_list --delete-excluded source/ dest

Erklärung der rsync-Schalter:

-P wie --partial --progress

-a Archivierungsmodus

-v ausführlich

--exclude-from=EXCL_list read schließt Muster aus der DATEI aus

--delete-excluded lösche auch ausgeschlossene Dateien aus den Zielverzeichnissen

weitere Informationen und Optionen finden Sie unter man rsync

Annahmen:

Befehle werden im Quellverzeichnis ausgeführt, das die zu verarbeitenden Dateien und Ordner enthält.

ziel im Befehl rsync ist ein bereitgestelltes Ziel, an das Sie schreiben dürfen.

Hier ist die Hoffnung, dass dies hilft.

Quellen:

http://www.linuxquestions.org/questions/linux-general-1/rsync-only-60-day-old-files-580357

https://unix.stackexchange.com/questions/92346/why-does-find-mtime-1-only-return-files-older-than-2-days

https://serverfault.com/questions/279609/what-exactly-will-delete-excluded-do-for-rsync

man find

man rsync

1
Elder Geek