root
Xorgはsystemd-logindと統合され、最高の権限を持つユーザーとして実行することなく、必要なデバイスを効率的に開くことができます。 systemd-logindセッションが終了すると、systemd-logindはデバイスへのXorgのアクセスを取り消します(ファイル記述子の取り消し[1])。
しかし、セッションを終了すると実際にXorgは終了しますか?
この質問は、Fedoraバージョン26 xorg-x11-server-Xorg-1.19.3-4.fc26.x86_64に基づいて作成されました。
[1]または技術的にログインがキャンセルされたと思います。説明するデバイスが開いたときに作成されます。文書記述子ログインはプロセスごとに行われ、直接的な影響はありません。記述子Xorgプロセスで。
ベストアンサー1
習慣。コードはそれを受け取らず、デバイスにアクセスせずに(そして再度アクセスする必要なしに)簡単に実行できます。私はこれがXorgとsystemd-logindの統合の監督だと思います。
現在、Xorgはセッションに関連する「範囲」単位で実行する必要があります。 XDG_SESSION_ID 環境変数を許可するように拡張できますが。これが最初に私の問題を引き起こしたものです。
セッションリーダー(最初のプロセス)が終了してセッションが終了すると、アップストリームのデフォルト値KillUserProcesses = yesがそのまま残っている場合にのみスコープが停止しますlogind.conf
。そうしないと、セッションが「破棄」され、GNU Screen などのプロセスがtmux
実行を継続できます。ほとんどのディストリビューションでは KillUserProcesses を無効にします。これは非常に疑わしいデフォルトです。
loginctl terminate-session
常にスコープユニットを停止します。ただし、範囲指定単位を停止すると、最初はSIGHUPが送信されます。これは明らかに「bashと友達」がSIGTERMを無視する傾向があるためです。いくつかの理由。多くのデーモンと同様に、XorgはSIGHUPを特別に扱います。 Xorg は SIGHUP をシャットダウンするのではなく、サーバーをリセットするように指示するシグナルとして扱います。私はこれがタイムアウト後にsystemdがSIGKILLを送信し、Xorgがまだ終了していないことを意味すると思います。 Xorgは適切なクリーンアップなしで強制終了することができます。
終了せずにXorgを再生成する手順:
nohup /usr/libexec/Xorg :5 vt5 -keeptty -novtswitch
root以外のユーザーとして実行します。 (vt5では、ctrl + alt + f5とも呼ばれるテキストコンソール5でこのコマンドを実行するとします。)- 別のテキストコンソールに切り替えます。ログイン。
ps -ax | grep bash
で実行されているbashシェルのPIDを見つけるために使用されますtty5
。走るkill -SIGHUP <PID>
bashプロセスが終了し、セッションからログアウトします。 VT 5に戻ると、コンソールログインプロンプトが表示されます。しかし、Xorgプロセスは実際にはまだ実行中です!
Xorgインスタンスのログファイルにまだ属していると思われるすべてのデバイスを解放し、再度開こうとすることがわかります。 Xorgがリセットされると、これが起こります。これでセッションが終了したため、使用するデバイスが残っていないため、デバイスを開こうとするすべての試みは失敗します。
Xorgは(:-にもかかわらず)SIGHUPを送信したためリセットされます
nohup
。私はgdb
それにこだわったのでこれを見つけました。 SIGHUPは、Xorgがそれ/dev/tty5
自身を再び開いてそれを「制御端末」として取得するために受信されます。で制御端子を見ることができますps -ax | grep Xorg
。強制的にログアウトするためにbashを終了すると、システムはTTYにハング(HUP)を生成します。 KillUserProcesses を設定しない限り、SIGHUP より強い信号は Xorg に送信されません。
それ以外の場合、リセットnovtswitch
はVT切り替えも試みます。ただし、ルート以外の X はアクティブ VT を変更できません。ステップ3は別のVTで実行されるため、このVT切り替え試行は失敗します。 VT 遷移が失敗すると Xorg は終了します。
これらのステップはnohup
必須です。それ以外の場合、Xorgは終了します。これはシェルジョブの管理に関連しています。証明:nohup
Xorgを使用せずにコマンドを使用してジョブ管理を無効にしても、Xorgは引き続き実行されますset +m
。