回答:
私は最近これをしなければなりませんでした。Stack Overflow で、screenで実行中のプロセスのPIDを見つける方法に答えました。PID ps
を取得したら、コマンドを取得するために使用できます。以下は、その回答の内容と、状況に対処するための追加の内容です。
次のように、ここでスクリーンセッションのPIDを取得できます。
$ screen -ls
There are screens on:
1934.foo_Server (01/25/15 15:26:01) (Detached)
1876.foo_Webserver (01/25/15 15:25:37) (Detached)
1814.foo_Monitor (01/25/15 15:25:13) (Detached)
3 Sockets in /var/run/screen/S-ubuntu.
foo_Monitor
スクリーンセッションでBashで実行されているプログラムのPIDが必要だとします。foo_Monitor
スクリーンセッションのPIDを使用してbash
、既知のPIDのPPID(親PID)を検索することにより、スクリーンセッションで実行されているセッションのPIDを取得します。
$ ps -el | grep 1814 | grep bash
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 1815 1814 0 80 0 - 5520 wait pts/1 00:00:00 bash
次に、bash
セッションのPIDのみを取得します。
$ ps -el | grep 1814 | grep bash | awk '{print $4}'
1815
ここで、その PIDを持つプロセスが必要です。コマンドをネストするだけで、今度は-v
フラグをオンにgrep bash
して、bash ではないプロセスを取得します。
$ echo $(ps -el | grep $(ps -el | grep 1814 | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
23869
そのPIDを使用してコマンドを見つけることができます(2行目の最後を見てください)。
$ ps u -p 23869
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
dotanco+ 18345 12.1 20.1 5258484 3307860 ? Sl Feb02 1147:09 /usr/lib/foo
まとめて:
$ ps u -p $(ps -el | grep $(ps -el | grep SCREEN_SESSION_PID | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
screen -S <your-fancy-name>
実行するコマンドに応じて、スクリーンセッションに意味のある名前を付けるためにを使用してどうですか?名前はにリストされscreen -ls
、によるセッションの再開に使用されscreen -r <your-fancy-name>
ます。
追加して編集:
先日、気になっていたので。tmux
とまったく同じ機能セットを提供しscreen
(それ以上ではない場合も)、ニーズに合った機能が付属しています。FAQから:「tmuxは、エスケープシーケンスを使用した大規模なハックなしに、実行中のアプリケーションに自動的にウィンドウの名前を変更することをサポートします。デフォルトではオンになっています。」