我一直在尝试为我们的软件设置服务文件,以便可以启动和停止它。当我手动运行命令时,服务器正常启动。接下来我将其实现到 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