Systemd

同步/在前台執行 systemd 服務

  • June 28, 2020

我想用我的自定義程序(類似資訊亭的設置)替換我的 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.servicePartOf=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並且可能是一個錯誤。但也許有人會發現它很有用。

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