systemctl start trafficserver 等待啟動
我有一個安裝和設置流量伺服器的腳本:
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