如何debugging系统单元ExecStart

我很好奇是否可以打印完全扩展的ExecStart/ExecStop命令行。 考虑下面的例子:

 ExecStart=/usr/bin/java $OPTS_COMMON $OPTS $OPTS_LOG $OPTS_DEBUG some.class.Start --param1 ${PARAM1} --param2 ${PARAM2} 

我有很长的命令行涉及到很多环境variables。 如果某些variables出错(例如通过插入式configuration),服务可能根本无法启动。 然而,我没有看到全面扩大与取代的envs行,我很难找出什么是错的。

我没有使用谷歌search这一点,迄今唯一的可能性,我发现是修改单元文件运行/usr/bin/echo而不是服务本身。 但是这有点令人厌烦。 或者更烦人的解决scheme – 逐个检查每个环境variables。

有没有办法强制systemd向我展示实际上试图运行的东西?

不幸的是,没有内置的方式。 要查看最终的ExecStart,您可以打开debugging。 编辑文件/etc/systemd/system.conf并设置LogLevel=进行debug 。 那么你会看到像这样的东西:

java.service About to execute: /usr/bin/java $OPTS_COMMON...这并不能解决你的问题,但很高兴看到systemd的说明符替代。 https://www.freedesktop.org/software/systemd/man/systemd.unit.html(specifiers)

但是,如果你真的想要得到更换参数的底部,你需要看看这里: https : //github.com/systemd/systemd/blob/7ce9cc154576e342015eab8c1500790a9ededc01/src/core/execute.c#L2570

在[服务]部分的* .service文件中

 ExecStartPre=/bin/bash -l -c 'echo "$OPTS_COMMON">/tmp/options.debug'