我创建了这个 systemctl 作业,
[Unit]
Description=Evercam Media
After=network.target
[Service]
Type=forking
User=root
Group=root
WorkingDirectory=/opt/evercam_media
ExecStart=/opt/evercam_media/bin/evercam_media start
ExecStop=/opt/evercam_media/bin/evercam_media stop
Restart=always
RestartSec=5
Environment=LANG=en_US.UTF-8
SyslogIdentifier=evercam_media
[Install]
WantedBy=multi-user.target
它工作完美,因为我希望它工作,但我想在启动和停止时显示一些日志,因为当我们启动或停止新贵作业时,它会向我们显示作业已停止或正在等待,但它没有显示任何内容,我们可以添加一些日志,例如“已启动”或“已停止”之类的日志吗?
另外,当我在做的时候看到这份工作的状态时systemctl status evercam_media.service
,它会告诉我
● evercam_media.service - Evercam Media
Loaded: loaded (/etc/systemd/system/evercam_media.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2017-11-07 10:53:40 CET; 1h 3min ago
Process: 25830 ExecStop=/opt/evercam_media/bin/evercam_media stop (code=exited, status=0/SUCCESS)
Process: 25692 ExecStart=/opt/evercam_media/bin/evercam_media start (code=exited, status=0/SUCCESS)
Main PID: 25728 (code=exited, status=1/FAILURE)
主动:失败??
为什么它不说它已停止而不是说失败?任何帮助将不胜感激,谢谢。
答案1
systemd 单元设置为异步命令Type=forking
并ExecStop=
与异步命令一起使用。
这意味着 systemd 将在之后立即终止主进程
/opt/evercam_media/bin/evercam_media 停止退出。并且
Restart=always
用来代替Restart=on-failure
.
正如其中所述文档:
请注意,为此设置指定一个命令通常是不够的,该命令仅要求服务终止(例如,通过为其排队某种形式的终止信号),但不等待服务终止。由于服务的剩余进程在命令退出后立即根据如上所述被终止
KillMode=
,KillSignal=
因此这可能不会导致干净停止。因此,指定的命令应该是同步操作,而不是异步操作。
您可以采取多种方法来解决此问题。使用TimeoutSec=
或使用不会返回evercam_media
1 的终止信号或找到一种方法使您的ExecStop=
同步。
至于日志消息,请参阅 的详细标志evercam_media
。