如何停止systemd服务

How stop systemd service

我正在尝试为 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 来杀死。

谢谢

您需要在 [Service] 部分中输入一个 ExecStop 选项,其中包含您要用于停止服务的命令。

类似于:

[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 上的手册,了解可用于控制服务的全套选项。

你可以直接执行systemctl stop flume-ng.service。执行时,默认操作是向主进程发送 SIGTERM 并等待可配置的时间以查看进程是否已终止。如果进程没有终止,那么 systemd 会发送 SIGKILL 信号来完成这项工作。如果主进程已经分叉出其他进程,systemd 也会将它们关闭,因为它们都在同一个 cgroup 中。

除非您有其他关闭服务的方法,否则您不需要 ExecStop= 指令。

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