Systemd

systemctl start trafficserver 等待啟動

  • April 17, 2020

我有一個安裝和設置流量伺服器的腳本:

yum install -y trafficserver
systemctl start trafficserver

traffic_line -s proxy.config.url_remap.remap_required -v 0
traffic_line -s proxy.config.reverse_proxy.enabled -v 0

問題是,traffic_line失敗了:

$$ connect $$錯誤(main_socket_fd 3):沒有這樣的文件或目錄錯誤:無法連接到管理埠,請確保 traffic_manager 正在執行

這是因為systemctl start立即返回,無需等待流量伺服器實際啟動。

有沒有辦法告訴systemctl start只有在服務啟動後才返回?

如果這是不可能的,是否有一個我可以執行的命令systemctl start來實際等待服務啟動?

這是因為systemctl start立即返回,無需等待流量伺服器實際啟動。

有沒有辦法告訴systemctl start只有在服務啟動後才返回?

systemctl start 確實等待服務準備好(除非使用 呼叫--no-block),服務只需要正確指示(即,不使用Type=simple)。如果服務沒有告訴 systemd 什麼時候準備好了,那麼 , 等的任何變化都systemctl is-active不會systemctl show幫助你。

正如評論中提到的,最優雅的解決方案是套接字單元。systemd 啟動套接字,traffic_line連接到它,systemd 啟動服務,並traffic_line阻塞,直到服務開始接受它從 systemd 繼承的文件描述符上的連接。

或者,您可以使用Type=forking(服務分叉,一旦分叉服務準備好主 PID 退出)或(服務一旦準備好就Type=notify呼叫)。sd_notify(0, "READY=1")

不幸的是,所有這些解決方案都需要一些支持trafficserver——使用 systemd 的套接字而不是分配自己的套接字,在主程序中適當地分叉和等待,或者呼叫sd_notify. 如果伺服器不合作,systemd 無法神奇地猜測伺服器何時準備就緒 :)


稍微看了一下trafficserver的原始碼,看起來它可能真的支持Type=forking——伺服器是由一個專用traffic_cop命令生成的,它似乎要等到伺服器啟動並執行一些基本測試(至少程式碼看起來像這樣) . 因此,如果您更改服務類型,它可能會起作用:

# /etc/systemd/system/trafficserver.service.d/type-forking.conf
[Service]
Type=forking

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