さまざまな理由から、ベンダーのアプリケーションをラップするシェルスクリプトがあります。私たちのシステム管理者とアプリケーションの所有者は、systemdに対してさまざまなレベルの使いやすさを持っています。したがって、アプリケーションが失敗した場合(systemctlもこれを示す)、一部のエンドユーザー(「root」システム管理者を含む)は、を使用する代わりにラッパースクリプトを使用して「直接」アプリケーションを起動できますsystemctl restart
。正しい終了スクリプトを呼び出しません。アプリケーションがすでに停止しているからです。
私はsystemdへの移行を案内するためにラッパースクリプトを更新してsystemdによって呼び出されるのか、エンドユーザーによって呼び出されるのかを確認したいと思います。外部systemdでは、呼び出し元にsystemctlを使用するように求めるメッセージを印刷したいと思います。
systemdで呼び出されるかどうかをシェルスクリプトでどのように確認できますか?
次のように仮定できます。
- スクリプトをラップするbashシェル
- ラッパースクリプトがアプリケーションを正常に起動および停止します。
- systemd サービスが期待どおりに動作します。
systemd サービスの例は次のとおりです。
[Unit]
Description=Vendor's Application
After=network-online.target
[Service]
ExecStart=/path/to/wrapper start
ExecStop=/path/to/wrapper stop
Type=forking
[Install]
WantedBy=multi-user.target
私は興味がない初期化システムの検出、私は既にそれがシステム化されていることを知っているので。
ベストアンサー1
~からルーカスウェイクマイスター豊富なコンテンツ応答サーバーエラー:
- systemd バージョン 231 以降では、ログに接続する stdout または stderr サービスに設定された JOURNAL_STREAM 変数があります。
- systemd バージョン 232 以降では、INVOCATION_ID 変数が設定されます。
これらの変数に依存したくない場合、または231以前のシステムバージョンの場合は、親PIDが1であることを確認できます。
if [[ $PPID -ne 1 ]]
then
echo "Don't call me directly; instead, call 'systemctl start/stop service-name'"
exit 1
fi >&2