
私たちはUbuntu 16.04 LTSを使用しており、起動時に起動する必要がある複数のTomcatインストールを使用したいと思います。 Tomcatの1つはJenkinsをホストして、別のTomcatにWebアプリケーションをデプロイして再起動します。
サービスを開始するためにsystemdサービススクリプトを追加しました。私たちは、男性の猫の1匹が止まったり死んだりすると、他の男性の猫も止まることを発見しました。
私たちはこれを/ usr / bin / yesだけを使用する2つの簡単なスクリプトに減らしました。
ユニットA
[Unit]
Description=A
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/bin/yes
ExecStop=/bin/kill -15 $MAINPID
User=tomcat8
Group=tomcat8
[Install]
WantedBy=multi-user.target
ユニットB
[Unit]
Description=B
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/bin/yes
ExecStop=/bin/kill -15 $MAINPID
User=tomcat8
Group=tomcat8
[Install]
WantedBy=multi-user.target
何が起こるか:1つのサービスが終了すると、2つのkill -9
サービスも一緒に消えます。
- 両方のサービスが終了したのはなぜですか?これが起こらないようにするにはどうすればよいですか?
- 単一のユーザーとして複数のサービスを実行することはお勧めできませんか、それとも良い方法ですか?
編集する:明確にするために - systemdなしでtomcatを起動したときも同じことをしようとしました。この場合の動作は予想通りです。つまり、終了したサービスのみが停止し、他のサービスは引き続き実行されます。
編集2:このユーザーは、ログイン/アウトを実行するフロントエンドユーザーではありません。サービスへのアクセスはシステムユーザーのみに制限されます。
答え1
これ変更ログsystemd(v230)の場合:
ユーザーがログアウトすると、systemd-logindはデフォルトでユーザーセッション範囲単位(session-XX.scope)の一部であるユーザープロセスを終了します。この動作はlogind.confのKillUserProcesses =設定によって制御されます。以前のデフォルト値「no」は「yes」に変更されました。これは、ユーザーセッションが後で適切にクリーンアップされますが、長期実行プロセスを意図的にログアウトしたままにするために追加の手順が必要であることを意味します。
これがデフォルトの動作です。また、変更をキャンセルする方法についても説明します。、、および)にlogind.conf
設定KillUserProcesses=
no
--without-kill-user-processes option
configure
ただし、変更ログには以下も含まれています。
ユーザーが1回以上ログインしたときに実行され、単一のログインセッションが
[email protected]
終了した後も維持する必要があるすべてのサービスは、ユーザーサービスまたはスコープを使用して開始できますsystemd-run
。 systemd-run(1)のマニュアルページは、以下の範囲で画面を実行する方法を示す例に展開されています[email protected]
。同じコマンドがtmuxでも機能します。
そして
ユーザーがすべてのセッションからログアウトした後[Eメール保護]また、ユーザーが有効になっていない限り、デフォルトで終了します
lingering
。ユーザーがログアウトしている間に長期実行ジョブを効果的に実行できるようにするには、遅延を有効にする必要があります。詳細は loginctl(1) を参照してください。ユーザーが認証なしで自分自身の遅延を設定できるように、デフォルトのpolkitポリシーを変更しました。。
これはデフォルト値(kill'm all)と例外を提供する方法(enable)を使用するため、より重要ですlingering
。
追加情報:
答え2
問題はsystemd
依存関係の配列にあると思います。
こんな音が出ますね緊密なロジック何が起こりますか?
シーケンシャル依存性を持つ 2 つのデバイスがシャットダウンすると、開始順序の逆が適用されます。つまり、あるデバイスが別のデバイスにAfter =を設定した場合、両方のデバイスがシャットダウンすると、前者は後者の前に停止します。
ただし、サンプルスクリプトには、2つの間に依存関係を作成したことは表示されません。
例「A」スクリプトを実行してみましたが、起動しませんでした。
Failed at step USER spawning /usr/bin/yes: No such process
(私はUbuntu 16.04でテストしました。)