同步/在前台執行 systemd 服務
我想用我的自定義程序(類似資訊亭的設置)替換我的 Xsession,以前我只是在我的文件中設置
STARTUP
變數,例如:.xsessionrc
STARTUP='/path/to/my/program'
現在我想將我的程序包裝為 systemd 服務,以利用一些 systemd 功能,如日誌記錄、可配置的自動重啟等。與以前的設置一樣,我更願意避免執行 3rd-party 會話和視窗管理器,但我仍然必須執行一些東西來保持會話活躍,所以我用過:
STARTUP='systemd-run --user --scope /path/to/my/program'
但是它仍然不是一個方便的 systemd 單元,最後我得到了:
STARTUP='systemd-run --user --scope --unit my-session sleep inf'
並為我的程序定義了一個服務單元來執行:
[Unit] Description=My service BindsTo=my-session.scope Requisite=my-session.scope After=my-session.scope [Service] Type=exec ExecStart=/path/to/my/program Restart=always [Install] WantedBy=my-session.scope
一般來說,這個設置就像一個魅力但是依賴於動態生成的範圍名稱對我來說似乎很笨重,而且有時它需要在會話重新啟動時進行隱式清理,例如:
systemctl reset-failed my.service my-session.scope
因為
systemd
抱怨my-session.scope
已經存在。因此,我正在尋找一種方法來同步執行 systemd 服務,
systemd-run --scope
但同時重新使用現有的單元文件而不是動態生成一個。PS:我嘗試了以下方法,但它不能正常工作(中斷 systemctl 不會中斷管理的服務):
systemctl start --wait my-session.target
終於找到了幾個合適的配置:
a) 將正在執行的服務標記為
StopWhenUnneeded
並使用以下Wants
屬性systemd-run --scope
:.xsessionrc:
STARTUP='systemd-run --user --scope --property Wants=my.service sleep inf'
我的服務:
[Unit] Description=My service StopWhenUnneeded=yes [Service] Type=exec ExecStart=/path/to/my/program Restart=always
這確實是最小的解決方案,並且可以完成所有需要的事情,但是無法
my.service
手動啟動。如果需要:b) 引入中間體
my-session.target
並聲明my.service
為PartOf=my-session.target
:.xsessionrc:
STARTUP='systemd-run --user --scope --property Wants=my-session.target sleep inf'
我的服務:
[Unit] Description=My service PartOf=my-session.target [Service] Type=exec ExecStart=/path/to/my/program Restart=always [Install] WantedBy=my-session.target
my-session.target:
[Unit] Description=My session StopWhenUnneeded=yes RefuseManualStart=yes RefuseManualStop=yes
c)最後值得注意的是,
systemd-run
不禁止使用“僅自動”屬性,例如BoundBy
/ConsistsOf
,因此可以這樣做:.xsessionrc
STARTUP='systemd-run --user --scope --property BoundBy=my.service --property Wants=my.service sleep inf'
我的服務:
[Unit] Description=My service [Service] Type=exec ExecStart=/path/to/my/program Restart=always
我會考慮將這些屬性用作hackish並且可能是一個錯誤。但也許有人會發現它很有用。