Systemd
systemd - 定義一個沒有 ExecStop 的服務,並且能夠在沒有“失敗”的情況下停止它
我使用 CentOS 7,我想將 Kafka 獨立生產者(文件連接器)作為服務啟動。命令是:
/opt/kafka/bin/connect-standalone.sh /opt/kafka/config/connect-standalone.properties /opt/kafka/config/connect-file-source.properties
而且,顯然,它沒有停止命令。通常,我只是
Ctrl+C
將其作為前台程序停止。但是當我測試時,我發現打開幾個終端控制台會話來執行幾個程序(Zookeeper、Kafka 伺服器、Kafka 生產者、Storm jar 等)非常繁瑣,所以我將 Zookeeper 和 Kafka 伺服器更改為服務,它們有他們的
stop
腳本。但在這種情況下,沒有。我試過
systemctl start kafka-producer
andsystemctl stop kafka-producer
,但服務進入failed
狀態,並沒有停止。我不得不刪除服務,重新載入守護程序,然後再次切換到手動。
kafka-producer.service
:[Unit] Description=Kafka Producer After=network.target [Service] Type=simple ExecStart=/opt/kafka/bin/connect-standalone.sh /opt/kafka/config/connect-standalone.properties /opt/kafka/config/connect-file-source.properties Restart=on-abort [Install] WantedBy=default.target
無論如何要在沒有
ExecStop
命令的情況下操縱服務?
如果您通常在 shell 中使用 CTRL+C 停止該程序,
SIGINT
則會向該程序發送一個(中斷信號)。(見man signal
)當 systemd 嘗試停止程序而不
ExecStop=
發送KillSignal=
預設為SIGTERM
(終止信號)的程序時,等待程序的響應,如果它未能在截止日期內停止,systemd 發送一個SIGKILL
簡單地強制結束程序的命令。systemd 的行為可以通過KillSignal=
(參見參考資料)進行修改man systemd.kill
。在您的情況下,我會嘗試添加
KillSignal=SIGINT
以模擬您通常在 shell 中使用的 CTRL+C。您知道您的程序擷取並響應此信號,但我們不知道它如何響應 SIGTERM。[Service] Type=simple ExecStart=/opt/kafka/bin/connect-standalone.sh /opt/kafka/config/connect-standalone.properties /opt/kafka/config/connect-file-source.properties KillSignal=SIGINT Restart=on-abort