systemd 服务执行 Shell 脚本时失败

systemd 服务执行 Shell 脚本时失败

因此我有一个名为 startup.service 的 systemd 服务:

[Unit]
Description=startup scripts

[Service]
Type=oneshot
ExecStart=/home/user/Documents/Tools/Scripts/startup.sh

[Install]
WantedBy=multi-user.target

调用名为 startup.sh 的脚本:

#! /bin/sh -
DIR='/home/user/Documents/Tools/Scripts'
$DIR/audio.sh
$DIR/powertop.sh
$DIR/xinput.sh

它调用一个名为 xinput.sh 的脚本:

导出 DISPLAY=:0.0 如果 xinput set-prop 11 297 -107 -107; 然后回显“完成!” fi

当我以 root 身份运行 startup.sh 时,xinput.sh 返回“完成!”并正确更改设置。当我以 root 身份运行 startup.service 时,xinput 失败并返回:

Jun 23 22:37:45 localhost startup.sh[7051]: No protocol specified
Jun 23 22:37:45 localhost startup.sh[7051]: Unable to connect to X server

(这都是在 X 启动之后)

有什么区别?为什么会发生这种情况?

答案1

systemd通过运行脚本和直接运行脚本的区别在于环境。你可以像这样测试它。在你的 Unit 文件中,将其添加到 [Service] 部分,以进行测试:

StandardOutput=console

然后在你的 bash 脚本的顶部添加此行来转储环境:

env

现在在 systemd 内部和外部运行脚本并比较转储的环境变量。

systemd 的一个特性就是可以严格控制环境。这既提高了安全性,又提供了一致性。

相关内容