如何调试系统单元ExecStart


12

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

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

我的命令行很长,涉及很多环境变量。如果某些变量出错(例如,通过嵌入式配置),则服务可能根本无法启动。但是,我在任何地方都看不到带有替代env的完全展开的行,因此我很难找出问题所在。

我没有运气谷歌搜索,到目前为止,我发现的唯一可能性是修改单元文件以运行,/usr/bin/echo而不是服务本身。但这有点累。甚至更烦人的解决方案-逐一检查每个环境变量。

有什么方法可以强制系统化地向我展示实际尝试运行的内容吗?

Answers:


9

不幸的是,没有内置的方式。要查看最终的ExecStart,可以打开调试。编辑文件/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(说明符)

但是,如果您真的想深入了解参数替换的内容,则需要查看以下内容:https : //github.com/systemd/systemd/blob/7ce9cc154576e342015eab8c1500790a9ededc01/src/core/execute.c#L2570


我有点害怕没有办法。:/ 不管怎么说,还是要谢谢你。
pystole's

2

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

ExecStartPre=/bin/bash -l -c 'echo "$OPTS_COMMON">/tmp/options.debug'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.