我试图在 Ubuntu 16.04 上运行 Flume 作为 systemd 服务,并有以下内容/etc/systemd/system/flume-ng.service
[Unit]
Description=Apache Flume
[Service]
ExecStart=/usr/bin/nohup /opt/flume/current/bin/flume-ng agent -c /etc/flume-ng/conf -f /etc/flume-ng/conf/flume.conf --name a1 &
ExecStop=/opt/flume/current/bin/flume-ng agent stop
[Install]
WantedBy=multi-user.target
我尝试添加以下几行
StandardOutput=/var/log/flume-ng/log1.log
StandardError=/var/log/flume-ng/log2.log
这对我不起作用。我确实跑了systemctl daemon-reload
并且systemctl restart flume-ng
有人知道这是如何运作的吗?
答案1
重定向
以下仅适用于 systemd v236 及更高版本:
StandardOutput=file:/var/log/flume-ng/log1.log
StandardError=file:/var/log/flume-ng/log2.log
据记录这里。
如果 systemd 早于 v236,您可以使用:
ExecStart=/bin/sh -c 'exec /usr/bin/my_binary [arguments] >/var/log/flume-ng/log1.log 2>/var/log/flume-ng/log2.log'
请注意,这样每次服务重新启动时整个日志文件内容都会被覆盖。
附加
如果您想在服务重新启动之间维护文件日志并仅向其附加新的记录行:
# Works only in systemd v240 and newer!
# (but backported to e.g. RHEL8)
StandardOutput=append:/var/log/flume-ng/log1.log
StandardError=append:/var/log/flume-ng/log2.log
如果 systemd 早于 v240,您可以使用:
ExecStart=/bin/sh -c 'exec /usr/bin/my_binary [arguments] >>/var/log/flume-ng/log1.log 2>>/var/log/flume-ng/log2.log'
exec
意味着shell程序将被my_binary
设置重定向后的程序替换,而不需要分叉。所以和my_binary
直接运行之后不会有什么区别ExecStart=
。
答案2
ExecStart=/usr/bin/nohup …
这是错误的。去掉它。此服务未在交互式登录会话中运行。首先没有控制终端或会话领导者向其发送挂断信号。
ExecStart=… &
这是错误的。去掉它。这不是 shell 脚本。 &
没有特殊的类似于 shell 的含义,并且无论如何都是启动服务的错误方法。
标准输出=/var/log/flume-ng/log1.log StandardError=/var/log/flume-ng/log2.log
这些都是错误的。不要使用这些。系统已经发送服务进程的标准输出和错误记录到其日志中,而服务单元中没有任何此类设置。您可以使用以下命令查看它:
Journalctl -e -u Flume-ng.service
答案3
用于记录到文件而不覆盖(需要 system.d 版本 240+):
StandardOutput=append:/var/log/flume-ng/log1.log
StandardError=append:/var/log/flume-ng/log2.log
或者
StandardOutput=append:/var/log/flume-ng/log.log
StandardError=inherit
答案4
如果您根本没有得到任何输出,您应该首先测试您的脚本。
例如,Python 脚本将缓冲输出流(但仅当它们通过管道传输时,而不是在控制台上测试时)。因此,在刷新缓冲区之前,您不会看到任何日志消息。
指定-u
开关 ( python3 -u script
) 或设置PYTHONUNBUFFERED
变量以避免这种情况:
Environment=PYTHONUNBUFFERED=1