Bash

通過systemd服務中的Exec管道輸出腳本?

  • November 14, 2021

我正在嘗試設置一個 systemd 服務,以便每天從基於日期的目錄中啟動一組文件(不同類型的期刊)。例如,今天的待辦事項列表將位於:

~/Documents/Journals/2019/1/23/ToDo.md 

現在最簡單的做法是把它放在一個單獨的目錄中,比如說今天,然後讓一個 bash 腳本在最後一次修改時間不再是創建時間或文件大小時將其移動到適當的位置大於模板文件。但是,雖然這會更容易,但我想知道是否可以編寫一個腳本來返回要通過服務中執行的命令管道傳輸的文件目錄。類似於以下內容:

ExecStart=/usr/bin/atom | /Path/To/Script/Todays_Dir Todo.md 

它將文件作為參數並根據日期返回目錄/文件路徑(與創建目錄和文件的方式相同)。

這是可能的,還是我應該堅持已經提出的解決方案?

是的,您可以直接寫入目標目錄。

您不能真正將管道直接用作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

execshell 腳本末尾的 使 shell 用程序替換自己,atom這樣 systemd 將atom在安裝後直接執行。對於這種情況,它並不那麼重要,因此可以省略(特別是如果您有興趣在執行後進行某種後處理atom。)

引用自:https://unix.stackexchange.com/questions/496368