systemd - 定义一个没有 ExecStop 的服务并且能够在没有“失败”的情况下停止它

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-producersystemctl 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

答案1

如果您通常从 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

答案2

安装了 HDP 2.6.4 和 Kafka 0.10.1 后,脚本报告

/usr/hdp/2.6.4.0-91/kafka/bin$ ./connect-standalone.sh
USAGE: ./connect-standalone.sh [-daemon] connect-standalone.properties

使用选项作为守护程序运行的属性-daemon

这对你来说可行吗?

相关内容