複数の端末が同時に実行され、新しい端末を起動してプログラム(例えばgnome-terminal -e pathto/myprogram
)を実行している状況では、myprogram
今すぐ把握する必要があります。具体的gnome-terminal
に実行中のPIDです。これはどのように達成できますか?
答え1
ターミナルまたはターミナルエミュレータで実行されているアプリケーションの入力/出力は、デバイスファイル/dev/ttysomething
から来ます。/dev/ptsomething
もう一方の端(1つ以上の疑似端末またはシリアル回線またはssh / telnet / rsh接続を含むことがあります)では、いくつかの物理、仮想、またはシミュレーション端末(おそらくブラウザウィンドウで実行されるjavascriptで書かれています)が実行されます。一部のローカルまたはリモートコンピュータは出力を読み取って画面に文字を表示し、入力した内容を文字として送信して入力を設定します。
このようにすると、「pid」を取得することは常に可能であるか、関連性/有用ではありません。 PIDを取得することもできますが、他のコンピュータで実行されているWebブラウザのPIDかもしれません。
これを行うことができ、あなたが好きな場合は限られていますgnome-terminal -e cmd
。
gnome-terminal
しかし、クライアント/サーバーアーキテクチャがあるので、特別なケースです。gnome-terminal -e cmd
、新しいターミナルエミュレータを実行する代わりに、仮想xterm -e cmd
ttyペアを作成し、cmd
スレーブ側でI / Oサブプロセスを実行してgnome-terminal
実行するようにサーバーに新しいgnomeターミナルウィンドウを開くように要求しますcmd
。
また、最新バージョンでは、次の警告に注意してください。
# Option “-e” is deprecated and might be removed in a later version of gnome-terminal.
# Use “-- ” to terminate the options and put the command line to execute after it.
2回実行してgnome-terminal -e zsh
ビューシェルの祖先を実行すると、pstree -slpa $$
次のようになります。
$ pstree -slpa $$
systemd,1 splash
└─systemd,7571 --user
└─gnome-terminal-,27110
└─zsh,27811
└─pstree,27988 -slpa 27811
$ pstree -slpa $$
systemd,1 splash
└─systemd,7571 --user
└─gnome-terminal-,27110
└─zsh,28134
└─pstree,28145 -slpa 28134
zsh
これはマルチスレッドにもかかわらず、両方のsを起動するのと同じプロセスです。
$ ps -Lp 27110
PID LWP TTY TIME CMD
27110 27110 ? 00:00:01 gnome-terminal-
27110 27111 ? 00:00:00 gmain
27110 27113 ? 00:00:00 dconf worker
27110 27114 ? 00:00:00 gdbus
両方のウィンドウは同じスレッドによって処理されます。
27110 pid(ほとんどのシェルで見つけることができますgetppid()
)を持つことは$PPID
あまり役に立ちません。これを殺すと、最終的に管理するすべてのウィンドウを終了します。
現在のウィンドウを終了するには、そのウィンドウ内で終了するだけですcmd
。
答え2
pathto / myprogramがシェルスクリプトの場合は、環境変数 '$ PPID'を使用できます。
[root@docker ~]# echo $PPID
20746
[root@docker ~]# ps auxw | grep 20746
root 20746 0.0 0.1 145696 5256 ? Ss 10:38 0:00 sshd: root@pts/0
root 20825 0.0 0.0 112648 964 pts/0 R+ 13:09 0:00 grep --color=auto 20746
[root@docker ~]#