systemd:nginxを起動する前に、カスタムシェルスクリプトの実行を完了してください。

systemd:nginxを起動する前に、カスタムシェルスクリプトの実行を完了してください。

Debian 9 stableを使用してNGINXプロセスと海岸壁ファイアウォールを起動する前に、カスタムシェルスクリプトを起動したいと思います。

  • 初期化タスクの実行
  • /etcNGINX構成、海岸壁構成、およびオーバーレイをオーバーレイするためにディレクトリ(overlayfs)をマウントします。/etc/hosts
  • スクリプトもで終わりますsync。良い考えなのかはわかりません。

systemctl リスト依存関係
default.target
● ├─display-manager.service
● ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
● ├─console-setup.service
● ├─cron.service
● ├ ─dbus.service
● ├─dropbear.service
● ├─myservice.service ​..] ● ├─basic.target ● │ ├─-.mount ● │ ├─myservice.service <-- マイサービス実行後







myservice.service 試す 1

[単位]
説明=私の開始 serviceRequires
=shorewall.service nginx.service
Before=shorewall.service nginx.service

[サービス]
RemainAfterExit=yes
ExecStart=/usr/local/bin/myservice start
ExecStop=/usr/local/bin /myservice停止

[インストール]
WantedBy=multi-user.target
WantedBy=basic.target

丸太:

Journalctl [...]
10月12日 11:31:43 server-dev nginx[448]: nginx: /etc/nginx/sites-enabled/defaultのアップストリーム "server-dev.com"の[emerg]ホストが見つかりません: 10月12日 33
11:31:43 server-dev nginx[448]: nginx: 構成ファイル /etc/nginx/nginx.conf テストに失敗しました <== NGINX: BAD
10月12日 11:31 :43 server-dev systemd[1] : nginx.service: 制御プロセスが終了しました。 code=exited status=1
Oct 12 11:31:43 server-dev systemd[1]: 高性能 Web サーバーとリバースプロキシサーバーを起動できません。
10月12日 11:31:43 server-dev systemd[1]: nginx.service: デバイスが障害状態に移行しました。
10月12日 11:31:43 server-dev systemd[1]: nginx.service: '終了コード'のため失敗しました。
Oct 12 11:31:43 server-dev systemd[1]: ターゲットマルチユーザーシステムに到達しました。
10月12日 11:31:43 server-dev systemd[1]: ターゲットグラフィックインターフェイスに到達しました。 10月12日 11:31:43 server-dev systemd
[1]: システム実行レベルの変更に対する UTMP アップデートを開始します。
のシステムUTMPアップデートを開始します。
10月12日 11:31:43 server-dev server[423]: DO: サーバー開始 DONE <== スクリプト終了 myservice 10月12日
11:31:43 server-devshorewall[449]: Shorewall 5.0.15.6 コンパイル中.. < == SHOREWALL: 確認
10月12日 11:31:44 server-devshorewall[449]: /etc/shorewall/shorewall.conf 処理中...
10月12日 11:31:44 server -devshorewall[ 449]: モジュールをロードしています。 ..

myserviceを実行した後、Shorewallシステムが正しく起動します。 Nginxはmyserviceの実行中に適切に上書き(上書き?)される前にほとんど起動されるため、/etc正しく初期化されません。

myservice.service 2回試行

私も変えようとしていました。

[インストール]
WantedBy=default.target

そして変化

[単位]
before=multiuser.target

それも動作しません。

myserviceが実行された後にnginxとshorewallが起動することを確認する方法は?

答え1

systemdサービスタイプを指定しない場合、デフォルト値はですType=simple。これは、基本サービスプロセスが分岐したとき(まだコマンドを実行していないときExecStart)、サービスが開始されたと見なされることを意味します。代わりに、サービスの開始を考慮する前にコマンドが終了するのを待つType=oneshotこの方法を使用できます。詳細はExecStart参照してください。man systemd.service

答え2

ExecStartPre=別のオプションを使用する代わりに(またはRequires=shorewall.servicenginxサービスユニットに追加することをお勧めしますが)、プラグインフラグメント設定のオプションを使用してNginxサービスユニットにオプションを追加できます。

このコマンドを使用します(sudo systemctl edit nginx.service含まれているフラグメント構成のディレクトリが作成されます)。/etc/systemd/system/nginx.service.d

タイプ:

[Unit]
Requires=shorewall.service
After=shorewall.service

または:

[Service]
ExecStartPre=/usr/bin/your_script

これは、nginxサービスユニットを起動する前に常にスクリプトを実行します。IgnoreSIGPIPE=noサービスセクションに追加する必要があります(シェルスクリプトであり、デフォルトではリダイレクトをサポートしていないため)。それ以外の場合、Systemd はリダイレクト、パイプ、シグナルを無視します。

用途:/etcNGINX構成、海岸壁構成、および/ etc / hostsをオーバーライドするためにディレクトリ(overlayfs)をマウントします。

サービスセクションに追加:

TemporaryFileSystem=/etc:ro,nodev,noexec,nosuid

これにより、ディレクトリの上部に空のtmpfsマウントポイントがマウントされます/etc。必要なすべてのファイルBindReadOnlyPaths=(2つのディレクトリ、5つのファイル)をバインドマウント(、使用)する必要があります。BindPaths=/etc

ホスト・ファイルをバインド・マウントするには、次のようにします。

BindReadOnlyPaths=/etc/hosts

(openssl、ca証明書、およびネームサービスを;)に追加します。

systemd.execスクリプトなしで環境、コンテナ化、ネームスペース、サンドボックス、MAC/IPS を設定します。

関連情報