Linux 带外壳扩展的Systemd单元配置

Linux 带外壳扩展的Systemd单元配置,linux,bash,systemd,Linux,Bash,Systemd,我终于尝试将旧的init.d管理脚本转换为systemd,但遇到了一个我希望其他人找到解决方案的障碍 我的应用程序需要一个参数作为它保存日志信息的文件名,我的初始化脚本在启动时使用以下行生成该名称: LOGFILE=`/bin/date "+$MUDDIR/lib/log/runlog.%y%m%d-%H%M%S"` 我将如何运行这样一个构造,以便在ExecStart中使用该值 我能做一些简单的事情吗 ExecStartPre=LOGFILE=`/bin/date "+${MUDDIR}/li

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

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

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行,它们会按顺序执行吗


谢谢你的提示。该文档在某些地方的细节上有点浅显,我只是试图保留我的原始功能,而不是太俗气,只是让它调用我的旧脚本。

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

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

Environment=LOGFILE=/dev/stdout

我同意OP关于让
journalctl
处理日志的回答。使用以下命令,而不是在
环境
属性中调用
/dev/stdout

[Service]
...
...
StandardOutput=syslog
StandardError=syslog
这将把您的日志放入系统日志,例如
/var/log/messages
journalctl
。您可以使用
服务名称
访问日志:

journalctl -u myawesomeservice.service
看起来,您可以设置日志文件的路径

StandardOutput=file:/path/to/logfile.log
StandardError=file:/path/to/logfile.err
以下是提供更多信息的示例。

请参见