手動停止的服務未正確停止
我有一個伺服器,如果有人試圖連接到它,它應該被啟動。為此,我創建了一個 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.service
Requires=server.service
我讓 proxy.serviceBindTo=server.service
。這樣,如果 server.service 停止或失敗,proxy.service 就會正確結束。現在 server.service 仍然處於
loaded deactivating stop
由於某種原因無法重新啟動的狀態。在腳本完成後,我讓程序失敗exit 1
,因此 server.service 進入狀態loaded failed failed
。因為 proxy.service 仍然需要 server.service 它重新啟動並且一切都按預期工作。
server.service
是Type=simple
各種類型的(如果指定了 an,則為預設值ExecStart=
)。關於它,文件
ExecStop=
中有一個有趣的花絮請注意,ExecStop= 中指定的命令僅在服務首先成功啟動時才會執行。如果服務根本沒有啟動,或者啟動失敗,例如因為 ExecStart=、ExecStartPre= 或 ExecStartPost= 中指定的任何命令失敗(並且沒有以“-”為前綴,則不會呼叫它們, 見上文)或超時…另請注意,如果服務啟動成功,則始終執行停止操作,即使服務中的程序自行終止或被殺死。停止命令必須準備好處理這種情況。
從您的問題來看,聽起來
server.service
它正在“自己”終止(而是通過您通過 FIFO 發送內容)。systemd 將看到這一點並呼叫ExecStop
. 這可能正在執行其他掛起的 FIFO 操作,從而導致“停用”行為。您應該確保
ExecStart
andExecStop
命令以零狀態退出並且不會掛起,以便 systemd 將服務註冊為非活動狀態。