Eu mesmo descobri isso.
O problema é que o crontab não roda no bash por padrão, ele roda em sh.
Eu adicionei esta linha na parte superior do crontab e agora ela funciona bem:
SHELL = / bin / bash
Eu estou tentando manter uma cópia de um monte de arquivos de um servidor remoto no meu servidor, e para fazer isso a cada 15 minutos eu quero trazer para o meu servidor os arquivos que foram alterados nos últimos 15 minutos (desde o último puxar)
Os arquivos podem ou não ser removidos do meu servidor de backup, então não quero rsync todos os arquivos porque isso copia novamente os arquivos que removi, a cada 15 minutos.
Para conseguir isso, faço um rsync a cada 15 minutos que busca os arquivos que foram alterados durante os últimos 15 minutos, no crontab desta maneira:
*/15 * * * * rsync -av --files-from=<(ssh root@remote-server 'find /remote/directory -type f -name remote-server-files.* -mmin -15 -exec basename {} \;' ) root@remote-server://remote/directory /local/directory 2> /var/log/rsync_cron.log && echo "[$(date)] Remote files saved successfully" >> /var/log/rsync_cron.log
Quando executo este comando no shell, funciona muito bem.
No entanto, quando o crontab o executa, ele gera o seguinte erro:
rsync: failed to open files-from file <(ssh root@remote-server find /remote/directory -type f -name remote-server-files.* -mmin -15 -exec basename {} \; ): No such file or directory
rsync error: syntax or usage error (code 1) at main.c(1422) [client=3.0.6]
Portanto, parece que o crontab não expande o comando interno e o executa para obter a lista dos arquivos.
Existe algum problema em fazer com que o crontab assuma o comando normalmente? Eu prefiro não criar um script para um one-liner