如果删除 StandardOutput 路径,服务将无法启动

如果删除 StandardOutput 路径,服务将无法启动

StandardOutput我有一项配置为记录到日志位置的服务。有些用户在收集日志数据时可能会删除日志路径。如果我重新启动服务并且路径不存在,我的服务将失败。有办法解决吗?按优先顺序排列的解决方案是

[Unit]
Description=Some service

[Service]
ExecStart=<some_path>/start_service.sh
Restart=on-failure
StandardOutput=append:<path_to_logs>/service-stdout.log

[Install]
WantedBy=default.target
  1. 创建记录 StandardOutput 的路径。使用 StartExecPre 和我的服务脚本本身尝试过此操作,但没有成功。

ExecStartPre=mkdir -p <path_to_logs>

  1. 忽略该路径不存在并继续而不记录任何内容。

  2. 登录到默认位置。试图在日志中找到输出,但我根本没有看到它。如果服务中没有指定StandardOutput参数,是否真的默认记录?

提前致谢

答案1

man systemd.exec说:

append:path 与上面的 file:path 类似,但它以附加模式打开文件。

file:path 选项...如果路径引用文件系统上的常规文件,则将其打开(如果尚不存在则创建)...

所以该文件不需要存在。但它所在的目录可能确实需要存在。

有几种方法可以确保您的日志目录存在:

  1. 如果您的软件已打包,请mkdir -p /var/log/...postinst.这将创建一个持久目录。这是微不足道的,所以我不会详细说明。
  2. tmp文件.d。这将确保该目录存在。如果它被删除(或存在于 tmpfs 上),它将在下次启动时重新创建。这就是 systemd 的保证/run/log/journal/var/log/journal存在方式。
  3. LogsDirectory=可用于在启动设备时创建日志目录。
  4. 路径单位。您可以创建一个名为“myservice.path”的全新单元,它确保在启动时创建目录并监视该目录。当该目录被删除时,该单元可以触发服务运行mkdir -p以重新创建它。

临时文件.d:

如果你想:

[Service]
StandardOutput=append:/var/log/myservice/log.log

然后创建这个文件:

# /etc/tmpfiles.d/myservice.conf
#Type Path               Mode User Group Age  Argument
d     /var/log/myservice 0755 root root  -    -

在这种情况下,您的用户可以读取此目录,但无法删除它(没有管理员权限)。如果被删除,可以通过重新启动systemd-tmpfiles-setup.service或重新启动来重新创建。

日志目录=

man tmpfiles.d说:

系统守护进程经常需要私有运行时目录...对于这些,如果不需要 tmpfiles.d 提供的灵活性,最好在其单元文件中使用 RuntimeDirectory= (有关详细信息,请参阅 systemd.exec(5) )。优点是该单元所需的配置集中在一处,并且目录的生命周期与服务本身的生命周期相关。同样,..., LogsDirectory=, ... 应该用于在 ... /var/log/ 下创建目录 ... tmpfiles.d 应该用于生命周期独立于任何服务或需要更复杂配置的文件。

因此,最好使用LogsDirectory=

优点之一是,如果您的用户删除该目录,则每当服务重新启动时都会自动创建该目录。

这是一个例子:

[Service]
ExecStart=<some_path>/start_service.sh
Restart=on-failure
StandardOutput=append:/var/log/myservice/service-stdout.log
LogsDirectory=myservice

该目录的路径也可以作为环境变量提供给您的服务$LOGS_DIRECTORY

此解决方案的缺点是您假设您的目录将始终以/var/log.在某些沙盒配置中(可能在使用时DynamicUser=)或者将此设备移至总线时,情况可能并非如此--user

答案2

如果您正在日志中查找日志,则需要将 stdout 设置为 syslogStandaedOutput=syslogrsyslog使用以下命令重新启动服务systemctl restart rsyslog

参考这个——https://stackoverflow.com/questions/37585758/how-to-redirect-output-of-systemd-service-to-a-file

相关内容