我无法摆脱 systemd.timer 的以下部分
--files-from=<(ssh -p 182 web-iot.com 'find /mnt/backups/postgresql/box/snapshots/ -mtime -7 -type f -exec basename {} \;') \
迄今已尝试:
--files-from=\\\<(ssh -p 182 web-iot.com \\\'find /mnt/backups/postgresql/box/snapshots/ -mtime -7 -type f -exec basename {} \;\\\') \
如果没有成功,我可以使用 shell 文件,但我认为这应该是可能的。
完整的 systemd.timer 执行:
ExecStartPre=/usr/bin/rsync \
--verbose \
--archive \
--times \
--partial \
--delete \
--progress \
--bwlimit=7000 \
--rsh="ssh -p 182" \
--files-from=\\<(ssh -p 182 web-iot.com 'find /mnt/backups/postgresql/box/snapshots/ -mtime -7 -type f -exec basename {} \;') \
web-iot.com:/mnt/backups/postgresql/box/snapshots/ \
/var/lib/postgresql/backups/box
答案1
<( )
是流程替代,它是一种特殊的 Bash 语法(也出现在其他一些 shell 中,但不出现在 dash 中)。Systemd 不使用 shell 来以行形式运行命令Exec*
,它本身只进行一些最小的处理(包括非常具体的变量扩展、模板等)。
因此您不能直接<( )
在行中使用ExecStartPre
。至少,您必须将其包装在 shell 中:
ExecStartPre=/bin/bash -c '/usr/bin/rsync \
--verbose \
--archive \
--times \
--partial \
...
(并相应地退出)。然后 systemd 将运行 bash,并且 bash 将处理进程替换。
但这里最好使用 shell 脚本。