変数を使用する独自の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
_のスコープは何ですか(ログイン後に値が明らかに失われているか、おそらく設定されていないため)?変数をグローバルに一度だけ定義するにはどうすればよいですか?
私は今、自分で質問に答えることができます。このいじくりくずで半日無駄にした後、私はうまくいく解決策を得ました。 /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停止承諾-サーバーでサービスを開始および停止することもできます
ここで起こっていることは、systemdを実行するシステムでsystem V initスクリプトを書いているということです。
あなたのsystemdはいくらか後方互換性があり、これらの古いスタイルのinitスクリプトを一種のエミュレーションで実行しますが、それらをsystemdとして扱います。
古いinitスクリプトを破棄して、新しいsystemdサービスを作成する方がよいでしょう。この方法では、必要ありません/etc/environment
。
これはいくつかの詳細な読み物です systemdサービスの書き方について。