Ubuntu

如何從具有多個服務的新貴腳本創建 systemd“全部啟動”模板單元文件?

  • July 2, 2021

我正在將所有自定義新貴腳本遷移到 systemd。我遇到了一個使用多種服務的腳本。我無法弄清楚處理這個問題的正確語法,或者我是否需要.service為每個文件創建單獨的單元文件。這可以用於模板嗎?SystemD單元文件沒有給我太多資訊,除瞭如何創建模板文件(附加@到名稱)以及如何使用%i來表示實例。

最初的暴發戶dealer-start-all.conf

console log
start on dealer-start
script
   declare -a dealers=("TimeZone" "Timeout" "Inquiry" "Refuse")

   for type in "${dealers[@]}"
   do
       if initctl list | grep "^dealer ($type)"
       then
           stop dealer type=$type
       fi
       start dealer type=$type
       echo "dealer$type started"
   done
end script

它的另一部分dealer.conf,應該通過%i在該ExecStart部分中使用而被很好地切割和乾燥,例如:

ExecStart=/usr/bin/php -f /path/to/dealer%i.php

console log

instance $type

stop on dealer-stop

script
       sudo -u root php -f /path/to/dealer$type.php
end script

post-stop script

if [ -z "$UPSTART_STOP_EVENTS" ]
   then
       echo "dealer$type stopped at `date +"%F %T.%N"` Run 'initctl emit dealer-stop' then 'initctl emit dealer-start' on `hostname` to get it running again." | mail -s "dealer$type Stopped" alerts@myemail.com
   else
       echo "dealer$type was manually stopped at `date +"%F %T"`."
fi
end script

我只是不明白如何將第一個中的數組轉換為 systemd 版本?我應該把這些分解成單獨的單元文件嗎?如果是這樣,那麼這不是問題並且可以輕鬆完成。我只是不確定語法(如果存在)來做第一個正在做的事情。

systemd 單元模板是一個模板。您不會將數組放入其中。相反,您將為您想要的每個實例實例化它,例如:

systemctl enable dealer@TimeZone
systemctl enable dealer@Timeout
...

模板中%i出現的位置將替換為您指定的位置。

您也不能%i. ExecStart=它必須是存在的路徑,並%i在其參數中使用。例如:

ExecStart=/usr/bin/php -f /path/to/dealer%i.php

引用自:https://serverfault.com/questions/1068500