Linux

After= 選項在 systemd 服務文件中不起作用

  • December 1, 2021

我有兩個 shell 腳本名稱 first.sh 和 second.sh。first.sh 和 second.sh 的內容如下:

   >>first.sh
   #!/bin/bash
   while true
   do 
       echo The current time is $(date)
       sleep(1)
   done



   >>second.sh
   #!/bin/bash
   while true
   do 
       echo The current time from second script is $(date)
       sleep(1)
   done

同樣,first.service的內容是:

[Unit]
Description=first service
After=second.service
[Service]
ExecStart=/home/abanstola/first.sh

second.service 的內容是:

[Unit]
Description=Second service
[Service]
ExecStart=/home/abanstola/second.sh

請注意After=second.servicefirst.service 程式碼中的 。根據文件,在第二個服務啟動之前,第一個服務不應該執行。但即使我禁用或停止第二個服務,第一個服務執行沒有任何問題。我在這裡做錯了什麼?

您誤讀了文件。報價

如果單元foo.service包含設置Before=bar.service 並且兩個單元都正在啟動bar.service則啟動將延遲到foo.service完成啟動。After=是 Before= 的倒數

由我突出顯示。這僅在兩個單元都被啟動時才有效。如果禁用其中之一,則無效。

目前還不清楚你真正想要什麼。

可能更好的選擇是:

Requires=

類似於Wants=,但聲明了更強的需求依賴。這種類型的依賴關係也可以通過將符號連結添加到.requires/單元文件隨附的目錄來配置。

如果該單位被啟動,列出的單位也將被啟動。如果其他單元之一未能啟動,並且After=設置了對失敗單元的排序依賴性,則該單元將不會啟動。此外,無論是否指定After=,如果其他單元之一被顯式停止,則該單元將被停止。

PartOf=

配置與 類似的依賴Requires=項,但僅限於停止和重新啟動單元。當 systemd 停止或重新啟動此處列出的單元時,該操作將傳播到該單元。請注意,這是一種單向依賴——對此單元的更改不會影響列出的單元。

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