首页 > 解决方案 > 带有外壳扩展的系统单元配置

问题描述

我终于尝试将我的旧 init.d 管理脚本转换为 systemd,并且遇到了我希望其他人找到解决方案的障碍。

我的应用程序需要一个参数作为它保存日志信息的文件的名称,并且我的 init 脚本在启动时使用以下行生成该名称:

LOGFILE=`/bin/date "+$MUDDIR/lib/log/runlog.%y%m%d-%H%M%S"`

我将如何运行这样的构造,以便在 ExecStart 中使用该值?

我可以做一些简单的事情吗

ExecStartPre=LOGFILE=`/bin/date "+${MUDDIR}/lib/log/runlog.%y%m%d-%H%M%S"`

还是会因为试图在那里产卵而大吃一惊?如果它将命令作为子 shell 运行,则该值将被丢弃。

另外,如果我指定多个 ExecStartPre 行,它们会按顺序执行吗?

感谢您的任何提示。该文档在某些地方的细节上有点简单,我只是想保留我的原始功能而不是俗气,只是让它调用我的旧脚本。

标签: linuxbashsystemd

解决方案


我建议让 systemd 通过它的日志来管理日志。根本不要创建日志文件。只需让应用程序写入 stdout/stderr。这样,日志将与所有其他应用程序的日志一起存储,它们可以通过 搜索journalctl,它们将显示在 中systemctl status <app>,它们将自动轮换,等等。

如果应用程序绝对需要$LOGFILE环境变量,您可以使用:

Environment=LOGFILE=/dev/stdout

推荐阅读