我正在尝试使用 systemd 控制工作站上连续运行的许可证服务器。服务本身是由一个 shell 脚本启动的,它本质上是
Usage: ./rlm_control.sh {start|stop|restart|status}
从这里我创建了一个 systemd 服务文件:
[Unit]
Description=RLM License Server
After=network.target
[Service]
Type=forking
ExecStart=/path/to/rlm_control.sh start
ExecStop=/path/to/rlm_control.sh stop
ExecReload=/path/to/rlm_control.sh restart
User=chris
Restart=on-failure
[Install]
WantedBy=multi-user.target
问题是这个控制脚本实际上用它自己的日志分叉了另一个进程rlm
。的日志rlm_control.sh
是由 journald 找到的,但rlm
不是。
是否可以以某种方式告诉 journald 本质上将输出附加tail -f /path/to/rlm.log
到该服务的日志中?
编辑:我注意到这是在 [0] 之前提出的,但该解决方案似乎建议使用命令附加日志,而不是调整服务文件以从另一个日志文件中读取。
[0]将日志从文件转发到日志
这里的问题是评论中已经说过的:您没有创建一个 systemd 单元,而是一个“systemd process spawner”。而且由于您谈论的是充分利用您的服务而不是将文件连接到您的日志,因此在将您的软件日志发送到 Journal 之前,您必须解决一些问题:
ExecStart=/path/to/license_software_bin -d parameter1 -f parameter2 -c -whatever
,而不是调用一个脚本,该脚本Type=forking
调用fork()
并杀死启动守护进程的父进程PIDFile=/run/path/to/pidfile.pid
以使进程识别更好。引用systemd.service
手册页:和:
看看
httpd.service
CentOS 7 的 systemd 单元的设计简单性:ExecStart=
直接调用二进制文件,因此PIDFile=
不需要,通过终止进程并给它一些时间来停止SIGCONT
并TimeoutStopSec
重新加载使用httpd -k graceful
Apache 本身特有的东西。