実行中のスクリーンセッションを一覧表示する方法は?


233

たくさんのサーバーがあり、その上でを使用して実験を行いscreenます。手順は次のとおりです。

  1. ssh サーバーXXXへ
  2. 打ち上げ screen
  3. いくつかのタブで実験を開始する
  4. 切り離す screen
  5. サーバーから切断する

実験の実行中、sshすべてのサーバーにアクセスし、実行中のプロセスを一覧表示することにより(topまたはを使用してps)、どのサーバー上にあるかを簡単に見つけることができます。

ただし、実験が終了したら、スクリーンセッションを開いているサーバーを(出力を確認したり、再起動したりできるように)どのようにして見つけることができますか?

PS:私の実験もその出力をファイルに出力します...しかし、これは私の質問のポイントではありません。

回答:


420

ユーザーのすべてのスクリーンセッションを一覧表示するには、そのユーザーとして次のコマンドを実行します。

screen -ls

特定のマシンのすべてのスクリーンセッションを表示するには、次のようにします。

ls -laR /var/run/screen/

私は自分のマシンでこれを取得します:

gentle ~ # ls -laR /var/run/screen/

/var/run/screen/:
total 1
drwxrwxr-x  4 root utmp   96 Mar  1  2005 .
drwxr-xr-x 10 root root  840 Feb  1 03:10 ..
drwx------  2 josh users  88 Jan 13 11:33 S-josh
drwx------  2 root root   48 Feb 11 10:50 S-root

/var/run/screen/S-josh:
total 0
drwx------ 2 josh users 88 Jan 13 11:33 .
drwxrwxr-x 4 root utmp  96 Mar  1  2005 ..
prwx------ 1 josh users  0 Feb 11 10:41 12931.pts-0.gentle

/var/run/screen/S-root:
total 0
drwx------ 2 root root 48 Feb 11 10:50 .
drwxrwxr-x 4 root utmp 96 Mar  1  2005 ..

これは、セキュリティ、状態、およびストリームを処理するためのファイルシステムのアクセス許可にラップされた、Unixソケットのかなり見事なUnix使用です。


1
質問に完全に回答したこの回答がなぜ反対票を投じたのか不思議に思っています
Blaszard

あるいは、命名規則に基づいて特定の画面を取得したい場合は、結果をgrepできます。ls -R /var/run/screen/S-root/ | grep "NamingConvention"。画面はこの<pid>.<screen_name>形式で保存されます。これはbashスクリプトに役立ちます。したがって、名前の付いた画面がある場合、0000.NamingConvention文字列は探している画面の名前を解析しやすい形式で文字列として返すだけです。
エリアスランツ


13

joshperryの答えは正しいですが、スクリーン名(-tオプションで設定したもの)が表示されないことは非常に不愉快です。これは、実際にセッションを識別するために使用するものです。(もちろん、彼のせいではなく、それは画面の欠陥です)

そのため、代わりに次のようなスクリプトを使用します。 ps auxw|grep -i screen|grep -v grep


2
-Sオプションを見てください。指定された値はUNIXソケットのファイル名に格納され、ls出力に表示されます。必要に応じて、-tオプションも保持できます。
joshperry 2017

:それはまた、あなたがそのセッション名で再開することができますよう-Sオプションは、素晴らしいですscreen -rd <sessionname>
jorisw

7

私はあなたの質問を本当に確信していませんが、あなたが本当に望んでいるすべてが現在開いているスクリーンセッションのリストであるなら、試してください:

screen -ls

6
 For windows system

 Open putty 
 then login in server

コンソールで画面を表示したい場合は、コマンドを記述する必要があります

 Screen -ls

画面にアクセスする必要がある場合は、以下のコマンドを使用する必要があります

 screen -x screen id

書き込みPWDあなたが現在どのフォルダにチェックするために、コマンドラインで


3

ほとんどの場合、 screen -RRx $username/十分です:)

それでもすべての画面を一覧表示したい場合は、次のスクリプトをパスに入れ、画面または好きなものを呼び出します。

#!/bin/bash
if [[ "$1" != "-ls-all" ]]; then
    exec /usr/bin/screen "$@"
else
    shopt -s nullglob
    screens=(/var/run/screen/S-*/*)
    if (( ${#screens[@]} == 0 )); then
        echo "no screen session found in /var/run/screen"
    else
        echo "${screens[@]#*S-}"
    fi
fi

オプション-ls-allを最初のパラメーターとして指定すると、すべての画面セッションを表示することを除いて、画面とまったく同じように動作します。


3

複数の人々がすでに指摘しています

$ screen -ls

スクリーンセッションを一覧表示します。

ここにあなたに役立つかもしれない別のトリックがあります。

サーバーxxxの.bashrcファイルの最後の行に次のコマンドを追加すると、ログイン時に自動的にスクリーンセッションに再接続します。

screen -d -r

お役に立てば幸いです。


1
画面を開始したのと同じユーザーとしてログインする必要があることに注意したいのですが、画面セッションが失われるのではないかと心配しましたが、ファイルのコピーがユーザー「media」の下で続行されていました。それは論理的に聞こえるかもしれませんが、あなたがそれを監督すれば、多少のパニックを救うことができます。
ポール

0

ps x | grep画面

コマンドを使用した場合に実行されている画面を確認するには

画面-A -m -d php make_something.php


-4

画面を使用して実験をバックグラウンドで実行し続けているのですか、それとも何ですか?もしそうなら、なぜそれをバックグラウンドで開始しないのですか?

./experiment &

そして、あなたが私がした仕事の通知を得る方法を尋ねているなら、メールコマンドで実験をひもでつなぐのはどうですか?

./experiment && echo "the deed is done" | mail youruser@yourlocalworkstation -s "job on server $HOSTNAME is done"

実験を終了せずにサーバーから切断できるように、screenを使用しています。問題は通知を取得する方法ではありませんでした(メールはそれを行うための良い方法である可能性があります)ではなく、特定のマシンに開かれたスクリーンセッションがあるかどうかを見つける方法です。とにかくあなたの答えをありがとう!
ウーカイ2009

私は経験豊富なシステム管理者ではありませんが、サーバープロセスを実行するために画面を使用するとうまくいきます。何か問題が発生した場合は、そのウィンドウにフリックするだけで、問題の原因となったすべての出力を確認できます-する必要はありませんログファイルのオープンを開始します。また、ctrl + cでプロセスを簡単に強制終了できることも意味します。これは、同じサービスを頻繁に開始およびシャットダウンする場合に便利です。
スティーブベネット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.