我创建了自己的使用变量的初始化脚本:
#! /bin/sh
case "$1" in
start)
echo "Starting Public API"
sudo -u techops sh ${JBOSS_HOME_PUBLIC_API}/bin/standalone.sh > ${PUBLICAPI_LOGGING_PATH} &
;;
stop)
echo "Stopping Public API"
sudo -u techops sh ${JBOSS_HOME_PUBLIC_API}/bin/jboss-cli.sh --connect --controller=localhost:$((9990 + $PUBLICAPI_PORT_OFFSET)) command=:shutdown > ${PUBLICAPI_LOGGING_PATH} &
;;
*)
echo "Usage: /etc/init.d/publicapi {start|stop}"
exit 1
;;
esac
exit 0
变量定义/etc/environment
如下:
PUBLICAPI_PORT_OFFSET=0
PUBLICAPI_LOGGING_PATH=/var/log/publicapi/publicapi.log
JBOSS_HOME_PUBLIC_API=/opt/publicapi
...当我手动启动和停止 init 脚本时,它们在登录后可以工作,但它们对启动 init 脚本(它们是、、/etc/init.d/publicapi
中的符号链接)不起作用。然后启动崩溃,因为变量是未知的。/etc/rc2.d/
/etc/rc5.d/
/etc/rc6.d/
我可以通过执行来解决这个问题systemctl edit publicapi
,它创建了一个文件,/etc/systemd/system/publicapi.service.d/local.conf
在我编辑它之后看起来像这样:
[Unit]
Description=Public API startup script
Documentation=no documentation
[Service]
Environment="JBOSS_HOME_PUBLIC_API=/opt/publicapi"
Environment="PUBLICAPI_PORT_OFFSET=0"
Environment="PUBLICAPI_LOGGING_PATH=/var/log/publicapi/publicapi.log"
当我重新启动时,init 脚本的启动正常。但现在我遇到了一个奇怪的情况:我总是需要在/etc/systemd/system/publicapi.service.d/local.conf
和 中定义变量/etc/environment
。如果我省略 中的变量/etc/environment
,init 启动脚本会执行但会崩溃,因为变量似乎未设置(至少在登录后没有设置)。如果我注释 中的变量/etc/systemd/system/publicapi.service.d/local.conf
并仅在 中设置它们/etc/environment
,则登录后会设置变量,但不会执行 init 启动脚本。这是怎么回事? 的范围是什么/etc/systemd/system/publicapi.service.d/local.conf
(因为值在登录后显然消失了或者可能没有设置)?我怎样才能全局定义一次变量?
答案1
这里发生的情况是,您正在运行 systemd 的系统上编写系统 V init 脚本。
您的 systemd 在某种程度上是向后兼容的,并且会以某种模拟方式运行这些旧式的 init 脚本,但将它们视为 systemd。
我认为你最好放弃旧的 init 脚本并编写新的 systemd 服务。这样你就不需要了/etc/environment
。
以下是一些进一步的阅读材料关于如何编写 systemd 服务。
答案2
现在我可以自己回答这个问题了。在浪费了半天时间处理这些垃圾问题后,我终于找到了一个可行的解决方案。/etc/init.d/ 或 /etc/rcX.d) 或其他地方不再有 init 脚本:
*)/etc/environment
JBOSS_HOME_CONSENT_SERVER=/opt/consent-server
CONSENT_SERVER_LOGGING_PATH=/var/log/consentserver/consent-server.log
CONSENT_SERVER_PORT_OFFSET=3000
*)创建一个包含以下内容的/home/techops
脚本:consent-server
#!/bin/sh
case "$1" in
start)
echo "Starting Consent Server"
sudo -u techops sh ${JBOSS_HOME_CONSENT_SERVER}/bin/standalone.sh > ${CONSENT_SERVER_LOGGING_PATH} &
;;
stop)
echo "Stopping Consent Server"
sudo -u techops sh ${JBOSS_HOME_CONSENT_SERVER}/bin/jboss-cli.sh --connect --controller=localhost:$((9990 + $CONSENT_SERVER_PORT_OFFSET)) command=:shutdown > ${CONSENT_SERVER_LOGGING_PATH} &
;;
*)
echo "Usage: systemctl {start|stop} consent-server or pass {start|stop} as parameter"
exit 1
;;
esac
exit 0
/etc/systemd/system/consent-server.service
*)创建一个包含以下内容的文件:
[Unit]
Description=consent server startup script
[Service]
Type=oneshot
RemainAfterExit=yes
#if type=oneshot and RemainAfterExit=yes is not set, then the script stops immediately!
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/consent-server start
ExecStop=/home/techops/consent-server stop
[Install]
WantedBy=multi-user.target
*) 激活服务(将创建符号链接):
systemctl enable consent-server.service
重启后,服务会自动启动,所有变量都会被识别。您还可以使用 systemctl start consent-server systemctl stop consent-server 来启动和停止服务