如何在 systemd 单元文件中运行源代码并导出以启动服务

如何在 systemd 单元文件中运行源代码并导出以启动服务

我一直在尝试为我们的软件设置服务文件,以便可以启动和停止它。当我手动运行命令时,服务器正常启动。接下来我将其实现到 bash 脚本中,并且它也正常启动。 bash 脚本:

#!/bin/bash
/bin/cd /opt/software/test/; source software_env.sh
export TEST_APP="/opt/software/testapp"
/bin/cd /opt/sotware/test/bin/; startserver

我尝试将这些命令实现到系统文件中,但似乎无法将其写入。因此,我尝试的下一件事是保留 bash 脚本并从如下所示的系统文件中调用它:

[Unit]
Description=Test Service

[Service]
Type=forking
ExecStart=/opt/software/test/test.startup

[Install]
WantedBy=multi-user.target

我也尝试将服务类型设置为,Type=simple但这也不起作用。我可以通过在重新启动时通过 cron 运行 bash 脚本来成功启动服务器,但如果有一种方法可以将该 bash 脚本放入服务文件中,这就是我最终想要做的。

困难似乎在于使源和导出在单元文件中正常工作。当我让 bash 脚本工作时,我还注意到一些奇怪的行为,运行:source /opt/software/test/software_env.sh而不是/bin/cd /opt/software/test/; source software_env.sh不起作用。

来自 systemd 的错误无论尝试让它运行的不同技术都给出了此错误。

test.service - Test service
Loaded: bad-setting (Reason: Unit test.service has a bad unit file setting.)
Active: failed (Result: exit-code)
Main PID: 2778 (code=exited, status)

感谢您的任何和所有建议。

答案1

systemd 无法直接使用 shell 命令行。因此,您可以传递某种 shell 实现来获取文件。对于您的情况,您可以尝试像这样修改您的单位:

ExecStart=/bin/sh -c '. /opt/software/test/software_env.sh'

Freedesktop有一份关于systemd的手册,你可以一探究竟

答案2

我不知道你的源文件是什么样的,但如果它是简单的VAR=VALUE格式,那么你可以使用EnvironmentFile功能。

[Service]
EnvironmentFile=/opt/software/test/software_env.sh
WorkingDirectory=/opt/software/test
Environment=TEST_APP=/opt/software/testapp
Type=forking
ExecStart=/opt/software/test/test.startup

相关内容