14

我正在尝试为Flume创建 systemd 服务文件,已创建/etc/systemd/system/flume-ng.service以下内容

[Unit]
Description=Apache Flume

[Service]
Environment=FLUME_CLASSPATH=/opt/flume/current/lib/
ExecStart=/usr/bin/nohup /usr/bin/flume-ng agent -c /etc/flume-ng/conf -f /etc/flume-ng/conf/flume.conf --name a1 &

[Install]
WantedBy=multi-user.target

哪个启动 Flume 服务,但我如何将其作为服务停止?

在这种情况下,我不得不用 PID 杀死。

谢谢

4

3 回答 3

24

你可以只执行systemctl stop flume-ng.service. 执行时,默认操作是发送SIGTERM到主进程并等到可配置的时间查看进程是否已终止。如果进程没有终止,则 systemd 发送SIGKILL信号来完成这项工作。如果主进程已经派生出其他进程,systemd 也会将它们删除,因为它们都位于同一个 cgroup 中。

你不需要有ExecStop=指令,除非你有不同的方式来关闭你的服务。

于 2016-11-04T10:42:00.133 回答
14

您需要在要用于停止服务的命令ExecStop的部分中添加一个选项。[Service]

就像是:

[Service]
Environment=FLUME_CLASSPATH=/opt/flume/current/lib/
ExecStart=/usr/bin/nohup /usr/bin/flume-ng agent -c /etc/flume-ng/conf -f /etc/flume-ng/conf/flume.conf --name a1 &
ExecStop=/usr/bin/flume-ng agent stop

或任何命令停止flume-ng

然后您可以使用 停止服务systemctl stop flume-ng

阅读https://www.freedesktop.org/software/systemd/man/systemd.service.html上的手册,了解可用于控制服务的全套选项。

于 2016-11-03T21:17:18.790 回答
0

在我看来, ExecStop是不够的。同样重要的是KillSignal=。您在此处使用的信号应该是您希望在内部处理并安全退出应用程序的信号。Systemd 将使用相同的方法来终止您的应用程序。如果 ExecStop= 未能退出进程,它将被 KillSignal 杀死。使用 systemd 的最后手段是使用 SIGKILL 并无论如何终止您的进程以继续系统关闭。

于 2021-03-03T10:12:29.873 回答