ウィンドウマネージャで起動されたアプリケーションの出力はどこに行きますか?

ウィンドウマネージャで起動されたアプリケーションの出力はどこに行きますか?

端末でアプリケーションを実行するとstdoutとstderrの出力が表示されますが、ウィンドウマネージャでアプリケーションを実行するとこれらのファイルの出力は通常どこに行きますか? /dev/nullで?

答え1

ウィンドウマネージャで起動されたアプリケーションの出力は、ウィンドウマネージャ自体の出力と同じ場所にあります。 (アプリケーションがリダイレクトしない限り、一般的なGUIアプリケーションはリダイレクトしません。)

ファイル記述子1(標準出力)とファイル記述子2(標準エラー)で開いている内容を見ると、WMの出力がどこに行くのかがわかります。通常、両方とも同じファイルに移動します。ウィンドウマネージャのプロセスIDを確認します(たとえば、pgrep metacityMetacityがウィンドウマネージャであることを確認します。ウィンドウマネージャのプロセス名がわからない場合は、pidof metacityプロセスツリーの1つのルートを表示または報告します)。ウィンドウマネージャのプロセスIDが1234であるとし、以下を実行します。ps fpstree

lsof -p1234

ファイル記述子1と2に対応する行を検索するか、

または

ls -l /proc/1234/fd

関連ファイル記述子を自動的にフィルタリングできます。

lsof -p1234 | awk '$4 ~ /^[12][^0-9]/'
ls -l /proc/1234/fd/[12]

(注:上記のすべてのコマンドはLinuxに適用されます。pgrep他のUnixで一般的であり、ほとんどどこにでもlsofインストールできます。psオプションと/proc内容はUnixによって異なります。)

通常、ターミナルエミュレータ(xterm、konsole、gnome-terminalなど)で実行されているシェルでコマンドを実行しますが、クロススクリーンやtmuxを使用するときは実行しません。これにより、端末エミュレータの出力がどこに行くかを簡単に確認できます。 place 、端末エミュレータがシェルの親プロセスであるためです。ターミナルエミュレータが追加の権限で実行されている場合、この方法は機能しません。これは、一部のシステムがターミナルエミュレータがログインしたユーザーのリスト(utmp)に書き込むことを許可する場合です。

lsof -p$PPID
ls -l /proc/$PPID/fd

多くのディストリビューションは、Xセッションの出力を~/.xsession-errors

答え2

ウィンドウマネージャはXサーバーの子なので、その子の出力はXサーバーと同じ場所にあります。

あなたが唯一のユーザーであり、グラフィカルにログインしている場合、一部のシステムは出力コンソールでXサーバーインスタンスを置き換えます。そのVTそしてそれを参照してください。興味深いことに、この配列は通常alt-ctrl-f1Xインスタンスの出力コンソールであり、Xモニタでもありますalt-ctrl-f7が、好きなだけ確認できます。最初の6つは通常ログインを生成しますが、ログインを生成せずに空白で表示されるか、パイプされた出力として表示されることがあります。これらのいくつかはinitの出力を持つ可能性があるため、Xの出力と混同しないでください。私の経験によれば、Xと子供は常に多くの警告とメッセージ(フォントの欠落、廃止された呼び出しなどについて)を発行しています。

GUIを介してログインしないと、Xを起動したVTは何でもあります。これはログアウトしないと表示できないため問題になります。 GUIを介してログインすると、グラフィカルログイン(XDM)は特権プロセスとして実行されます。つまり、正しいスーパーユーザー権限があれば、出力を/dev/tty7startx 1>&2> /dev/tty7

答え3

考えると、通常、プログラムは一連のタスクを実行して別のプログラムを起動し、そのman 2 forkプロセスman 2 execve中にデフォルトのファイル記述子が開いたままになります。

したがって、答えは通常、親プロセスの出力/エラーが分岐の時点で指すところで出力/エラーが発生することです(もちろん、親が一部のリダイレクトを実行しない限り)。親プログラムが何であるかを正確に知らないと、より具体的なものを宣言できないようです。ウィンドウマネージャプロセスは、他のプログラムの直接起動にはほとんど関与しません。

私を例に挙げてください。

  • Ctrl + P(xmonadウィンドウマネージャで処理)を押すと実行されます。dmenu_run
  • dmenu_run私の入力を処理し、いくつかのアプリケーションを起動します(例xkill:)

出力は/dev/tty1次に移動します。

  • xkill次から始まったdmenu_run
  • dmenu_run次から始まったxmonad
  • xmonad次から始まったX
  • X次から始まったstartx
  • startx最初の仮想コンソールで、私は手動で起動しました。/dev/tty1

参考までに、出力/エラーがどこに行くのか、特定のプロセスに対して開いているファイル記述子(既知のPIDを含む)をよりよく知りたい場合は、次の手順を実行します。

$ lsof -p PID

関連情報