在 systemd.timer 中退出

在 systemd.timer 中退出

我无法摆脱 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 脚本。

相关内容