Systemd

systemd start stop 使用一個目標單元啟用和禁用多個服務

  • March 31, 2022

我創建了一個目標文件 /etc/systemd/system/watch-for-sync-need-all.target

[Unit]
Description=systemd target to group services for all folders that create a sync need by changes
After=multi-user.target
Wants=watch-for-sync-need@_sl_home_sl_.service
Wants=watch-for-sync-need@_sl_stream_sl_.service

[Install]
Also=watch-for-sync-need@_sl_home_sl_.service
Also=watch-for-sync-need@_sl_stream_sl_.service

其目的是能夠啟動、停止、啟用或禁用所有在目標指定的systemd模板服務/etc/systemd/system/watch-for-sync-need@.service

[Unit]
Description=watch sync folders for changes then flag sync need and set rtcwake
BindsTo=watch-for-sync-need-all.target
After=watch-for-sync-need-all.target

[Service]
User=root
Group=root
Type=simple
ExecStart=/bin/bash /etc/custom/notify-on-change %i
Restart=on-failure
RestartSec=3

[Install]
WantedBy=watch-for-sync-need-all.target

如果它必須處理我的問題,我會發布 /etc/custom/notify-on-change 的呼叫腳本內容

#! /usr/bin/env bash

inotifywait -q -m -r -e modify,delete,create "${1//_sl_//}" | while read DIRECTORY EVENT FILE
do
   echo "yes" > /etc/custom/log/sync-needed
   bash /etc/custom/set-rtcwake
   systemctl stop watch-for-sync-need-all.target
done

如果文件夾 /home/ 或 /stream/ 發生更改,inotifywait 會注意到,標記同步需求,在即將到來的晚上 3 點設置電腦自我喚醒並停止服務。(如果標記了同步需要,則機器上有一個 cronjob 會在 3 點鐘後的幾分鐘內同步到另一台電腦。電腦在不使用時會自行關閉。這樣,我可以在我的電腦上工作並製作/home/ 或 /stream/ 中的更改,然後並且只有在那時才會自動開始同步。)

我的問題是,我無法充分啟用我的目標。可以毫無問題地啟動或停止目標。這意味著,兩個“子”單元都在執行。啟用不會發出任何警告並在目錄 /etc/systemd/system/watch-for-sync-need-all.target.wants 中創建相應的連結,但是當我的機器啟動時,“子”單元沒有執行。新啟動後,我得到以下輸出

systemctl status watch-for-sync-need-all.target 

watch-for-sync-need-all.target - systemd target to group services for all folders that create a sync need by ch>
Loaded: loaded (/etc/systemd/system/watch-for-sync-need-all.target; indirect; vendor preset: enabled)
Active: inactive (dead)`enter code here`

或者

systemctl status watch-for-sync-need@_sl_home_sl.service

watch-for-sync-need@_sl_home_sl.service - watch sync folders for changes then flag sync need and set rtcwake
Loaded: loaded (/etc/systemd/system/watch-for-sync-need@.service; disabled; vendor preset: enabled)
Active: inactive (dead)

如何讓 systemd 在系統啟動時啟動目標(所有“子”單元)?

在 /etc/systemd/system/watch-for-sync-need-all.target 的安裝部分中,multi-user.target 必須添加為 WantedBy,現在它可以工作了。在這個堆棧溢出執行緒Systemd with multiple execStart comment 5 by Johny 中提到了這一點。

我不明白,為什麼需要這樣做,因為目標應該在 multi-user.target 之後啟動,就像 Unit-section 中定義的那樣,據我所知,unit-section 考慮了它的所有操作,包括啟用在系統啟動時。

無論如何,我希望這個執行緒和答案有所幫助。

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