Cron 仅运行脚本的第一部分

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.dcrontab -ecron.daily。 既可以将脚本直接放入crontab文件中,也可以调用.sh脚本文件。 有什么想法可以解决这个问题吗?

答案1

该命令被截断,因为%在 中具有特殊含义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

答案2

我建议采用另一种方法。使用临时文件可以让你的生活更轻松,并帮助你避免使用可能导致 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从文件中读取排除模式

--delete-excluded也删除排除文件来自目标目录

如需了解更多详细信息和更多选项,请参阅man rsync

假设:

命令在包含您要处理的文件和文件夹的源目录中运行。

rsync 命令中的 dest 是您有写入权限的挂载目标。

希望这能有所帮助。

资料来源:

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

相关内容