Bash

手動停止的服務未正確停止

  • August 14, 2020

我有一個伺服器,如果有人試圖連接到它,它應該被啟動。為此,我創建了一個 systemd 套接字和服務,為我的伺服器建構代理並啟動它。多虧了本教程,這並不太難。

我製作了一個 FIFO-Pipe 來與正在執行的伺服器進行通信,如果沒有人在上面活動,我希望伺服器停止。如果我通過管道停止伺服器,則 Server.service 保持在loaded deactivating stop狀態,而 proxy.service 保持在執行狀態。(狀態來自systemctl list-units

如果有人嘗試再次連接,我希望服務再次重新啟動,但這僅在我手動時才有效systemctl stop server.service


代理.socket

[Socket]
ListenStream=25565

[Install]
WantedBy=sockets.target

代理伺服器

[Unit]
Requires=server.service
After=server.service

[Service]
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:25555

伺服器.服務

[Unit]
Description=my Server

[Service]
User=nonRootUser
ExecStart=/home/nonRootUser/server/startup-fifo.sh
ExecStop=/home/nonRootUser/server/cmd stop

我解決了這個問題,即使它可能很醜陋。

而不是讓 proxy.serviceRequires=server.service我讓 proxy.service BindTo=server.service。這樣,如果 server.service 停止或失敗,proxy.service 就會正確結束。

現在 server.service 仍然處於loaded deactivating stop由於某種原因無法重新啟動的狀態。在腳本完成後,我讓程序失敗exit 1,因此 server.service 進入狀態loaded failed failed

因為 proxy.service 仍然需要 server.service 它重新啟動並且一切都按預期工作。

server.serviceType=simple各種類型的(如果指定了 an,則為預設值ExecStart=)。

關於它,文件ExecStop=中有一個有趣的花絮

請注意,ExecStop= 中指定的命令僅在服務首先成功啟動時才會執行。如果服務根本沒有啟動,或者啟動失敗,例如因為 ExecStart=、ExecStartPre= 或 ExecStartPost= 中指定的任何命令失敗(並且沒有以“-”為前綴,則不會呼叫它們, 見上文)或超時…另請注意,如果服務啟動成功,則始終執行停止操作,即使服務中的程序自行終止或被殺死。停止命令必須準備好處理這種情況。

從您的問題來看,聽起來server.service它正在“自己”終止(而是通過您通過 FIFO 發送內容)。systemd 將看到這一點並呼叫ExecStop. 這可能正在執行其他掛起的 FIFO 操作,從而導致“停用”行為。

您應該確保ExecStartandExecStop命令以零狀態退出並且不會掛起,以便 systemd 將服務註冊為非活動狀態。

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