Systemd

systemd - 定義一個沒有 ExecStop 的服務,並且能夠在沒有“失敗”的情況下停止它

  • November 5, 2021

我使用 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-producerand systemctl 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

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