web-dev-qa-db-ja.com

initスクリプトとシステムの両方のシステム全体の変数?

変数を使用する独自のinitスクリプトを作成しました。

_#! /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スクリプトを手動で開始および停止すると動作しますが、それらは起動初期化スクリプトでは機能しませんでした(これは_/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_のスコープは何ですか(ログイン後に値が明らかに失われているか、おそらく設定されていないため)?変数をグローバルに一度だけ定義するにはどうすればよいですか?

3
Bevor

私は今、自分で質問に答えることができます。このいじくりくずで半日無駄にした後、私はうまくいく解決策を得ました。 /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承諾-サーバーsystemctl停止承諾-サーバーでサービスを開始および停止することもできます

1
Bevor

ここで起こっていることは、systemdを実行するシステムでsystem V initスクリプトを書いているということです。

あなたのsystemdはいくらか後方互換性があり、これらの古いスタイルのinitスクリプトを一種のエミュレーションで実行しますが、それらをsystemdとして扱います。

古いinitスクリプトを破棄して、新しいsystemdサービスを作成する方がよいでしょう。この方法では、必要ありません/etc/environment

これはいくつかの詳細な読み物です systemdサービスの書き方について。

3
Robert Riedl