Cron запускает только первую часть сценария [дубликат]

Это сценарий, который я использую:

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/

Это из журнала:

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

Я пробовал использовать cron.d , crontab -e и cron.daily . Оба помещают сценарий непосредственно в файл crontab , а также вызывают файл сценария .sh . Есть идеи, как я могу это решить?

2
задан 22 January 2017 в 21:30

2 ответа

Команда усекается, потому что % имеет особое значение в cron . Из 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 "\".

, в котором объясняется, почему зарегистрированная команда выглядит примерно так:

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

Чтобы продемонстрировать, что экранирование работает, дается:

$ 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

Затем добавляем crontab как:

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

(обратите внимание на это использует форму с завершающим нулем \ 0 ) создает файл журнала:

$ 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

, указывающий, что резервное копирование выполнено успешно и скопированы только новые файлы:

$ 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

Обратите внимание, что вы не сможете проверить экранирование вне вашего crontab - в терминале это приведет к ошибке из find .

3
ответ дан 2 December 2019 в 02:16

Я предлагаю альтернативный подход. Использование временных файлов может облегчить вашу жизнь и поможет избежать использования каналов, которые могут вызвать проблемы с заданиями cron.

Процесс здесь довольно прост. Сначала введите команду

find ./ -daystart -mtime +2> myfile

Примечание:

Вышеупомянутое будет соответствовать файлам возрастом от 2 до 3 дней, поскольку в нем используются целые дни. * При необходимости измените или используйте -mmin и минуты для более точного выбора. Результаты сопоставления будут записаны в файл myfile, который будет: перезаписывается каждый раз при запуске команды.

Затем введите команду: sed 's | ./ ||' myfile> EXCL_list , чтобы удалить ненужный префикс. Файл EXCL_list будет перезаписываться каждый раз при запуске команды.

Наконец, введите команду:

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

Объяснение переключателей rsync :

-P то же, что --partial --progress

-a режим архивирования

-v подробный

- exclude-from = EXCL_list читать исключить шаблоны из ФАЙЛА

- удалить-исключить также удалить исключенных файлов из директорий dest

для получения более подробной информации и дополнительных опций см. man rsync

Допущения:

Команды запускаются в исходном каталоге, содержащем файлы и папки, которые вы хотите обработать.

dest в команде rsync - это смонтированный пункт назначения, в который у вас есть разрешение на запись.

Надеюсь, это поможет.

Источники:

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

https://unix.stackexchange.com / questions / 92346 / почему-находит-mtime-1- only-return-files-old-than-2-days

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

человек найти

man rsync

1
ответ дан 2 December 2019 в 02:16

Другие вопросы по тегам:

Похожие вопросы: