web-dev-qa-db-fra.com

Cron ne lance que la première partie du script

C'est le script que j'utilise:

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

Ceci est tiré du journal:

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

J'ai essayé d'utiliser cron.d, crontab -e et cron.daily. Placer le script directement dans le fichier crontab et appeler un fichier de script .sh. Avez-vous des idées pour résoudre ce problème?

2
Ayys

La commande est tronquée car % a une signification particulière dans cron. De 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 "\".

ce qui explique pourquoi la commande enregistrée ressemble à quelque chose comme:

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

Pour démontrer que l'évasion fonctionne, étant donné:

$ 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

Puis en ajoutant la crontab en tant que:

* * * * * 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

(notez que ceci utilise la forme à zéro terminal \0]) génère le fichier journal:

$ 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

indiquant que la sauvegarde s'est exécutée avec succès et n'a copié que les fichiers les plus récents:

$ 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

Notez que vous ne pourrez pas tester l'échappement en dehors de votre crontab - dans le terminal, cela entraînera une erreur defind.

3
steeldriver

Je suggère une approche alternative. L'utilisation de fichiers temporaires peut vous simplifier la vie et vous évitera d'utiliser des pipes qui peuvent causer des problèmes avec les tâches cron.

Le processus est assez simple. D'abord donner la commande

find ./ -daystart -mtime +2 >myfile

Remarque:

Ce qui précède correspond aux fichiers âgés de 2 à 3 jours car il utilise des jours entiers. * Modifiez-le si nécessaire ou utilisez -mmin et minutes pour une sélection plus précise. Les résultats correspondants seront écrits dans le fichier myfile qui sera écrasé à chaque exécution de la commande.

Exécutez ensuite la commande: sed 's|./||' myfile >EXCL_list pour supprimer le préfixe inutile. Le fichier EXCL_list sera écrasé à chaque exécution de la commande.

Enfin, lancez la commande:

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

Explication des commutateurs rsync:

-P identique à --partial --progress

-a mode d'archivage

-v verbeux

--exclude-from=EXCL_list lire les motifs d'exclusion à partir du fichier

--delete-excluded supprime également les fichiers exclus des répertoires de destination

pour des informations plus détaillées et des options supplémentaires, voir man rsync

Hypothèses:

Les commandes sont exécutées dans le répertoire source contenant les fichiers et les dossiers à traiter.

dest dans la commande rsync est une destination montée sur laquelle vous êtes autorisé à écrire.

En espérant que cela aide.

Sources:

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-file-older-than-2-days

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

man find

man rsync

1
Elder Geek