![通过 systemd 服务中的 Exec 管道输出脚本?](https://linux22.com/image/146851/%E9%80%9A%E8%BF%87%20systemd%20%E6%9C%8D%E5%8A%A1%E4%B8%AD%E7%9A%84%20Exec%20%E7%AE%A1%E9%81%93%E8%BE%93%E5%87%BA%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
我正在尝试设置一个 systemd 服务,以便每天从基于日期的目录启动一组文件(不同类型的日记)。例如,今天的待办事项列表将位于:
~/Documents/Journals/2019/1/23/ToDo.md
现在最简单的事情就是把它放在一个单独的目录中,比如说今天,然后让一个 bash 脚本在最后一次修改时间不再是它创建的时间或者文件大小时将它移动到适当的位置比模板文件大。但是,虽然这会更容易,但我想知道是否可以编写一个脚本来返回要通过服务中执行的命令进行管道传送的文件的目录。大致如下:
ExecStart=/usr/bin/atom | /Path/To/Script/Todays_Dir Todo.md
它将以文件作为参数并根据日期返回目录/文件路径(与创建目录和文件的方式相同)。
这是可能的,还是我应该坚持已经提出的解决方案?
答案1
是的,您可以直接写入目标目录。
您实际上不能直接使用管道作为ExecStart=
命令的一部分,因为 systemd 并没有真正实现完整的 shell。但是您可以显式调用 shell,这将使其正常工作。例如:
ExecStart=/bin/sh -c '/usr/bin/atom | /Path/To/Script/Todays_Dir Todo.md'
但事实证明这有点尴尬,因为Todays_Dir
最终必须运行cat
才能写入其参数的完整路径。实际上,您实际上并不需要这里的管道,您只需要确定目录的名称并atom
使用正确的重定向来运行。
考虑只在脚本中实现所有内容并直接从 systemd 单元运行它。
就像是:
#!/bin/bash
set -e # exit on error
dated_dir=$HOME/Documents/Journals/$(date +%Y/%-m/%-d)
mkdir -p "${dated_dir}"
exec atom >"${dated_dir}/ToDo.md"
然后在 systemd 单元中:
ExecStart=/Path/To/Script/GenerateMarkdownToTodaysDir.sh
shell 脚本末尾exec
的 使 shell 替换为程序atom
,这样 systemd 将atom
在安装后直接运行。对于这种情况,它并不那么重要,因此可以省略(特别是如果您有兴趣在运行后进行某种后处理atom
)。
答案2
你说“我试图按照 ExecStart=/usr/bin/atom /home/user/documents/journal/2019/1/23/todo.md 的方式分配一些东西”,所以明显的答案是
ExecStart="/usr/bin/atom /home/user/documents/journal/2019/1/23/todo.md"
但我想这就是你现在想要的。
如果/home/user…
来自命令那么你可以这样做
ExecStart="/usr/bin/atom $(command)"
或者
ExecStart='/usr/bin/atom "$(命令)"'
懒得评价它。