初始化脚本和系统的系统范围变量?

初始化脚本和系统的系统范围变量?

我创建了自己的使用变量的初始化脚本:

#! /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 来启动和停止服务

相关内容