web-dev-qa-db-ja.com

指定した名前の画面が存在するかどうかの確認

別のbashファイルを一意の名前でデタッチされた画面で起動するbashファイルを作成しました。その内部bashファイルのインスタンスが1つだけ実行されていることを確認する必要があります。これを行うには、親bashファイルをチェックして、その名前の画面が存在するかどうかを確認してから、作成を試みます。これを行う方法はありますか?

31
Zoey

screen -listの出力を確認して、チェックしているセッションの名前を取得できます。

if ! screen -list | grep -q "myscreen"; then
    # run bash script
fi
29
chepner

特定のセッションの画面「select」コマンドを照会できます。セッションが存在する場合、シェルの結果は「0」であり、名前付きスクリーンセッションが見つからない場合は「1」です。

 
 $ screen -S Tomcat 
 $ screen -S Tomcat -Q select。 ;エコー$?
 0 
 

対:

 
 $ screen -S Jetty -Q select。 ; echo $?
スクリーンセッションが見つかりません。
 1 
 

'.'の後のselectはオプションですが、より堅牢な場合があります。

17
troyfolger

コメントできないので、これを新しい回答として投稿しています。トロイフォルガーの答えは良い考えであり、基本的にセッションにほとんど何もしないコマンドを送信して送信することになります。 1つの問題は、screen -Qの一部の(古い)バージョンではサポートされていないため、これらのバージョンでは正しいコマンドが

screen -S Jetty -X select . ; echo $?

コマンド「select」を送信します。 「ジェティ」と呼ばれるスクリーンセッションに。

選択すると、アクティブなウィンドウとが変わります。これは現在アクティブなウィンドウを意味するので、これはアクティブウィンドウを現在アクティブなウィンドウに変更しようとすることを意味します。これは、接続するセッションがない場合にのみ失敗する可能性があります。

あなたがそれよりも情報ドキュメントを読んだ場合は、selectの唯一の使用を推奨します。テストとして、または何かが選択されていることを確認するために-Xを使用します。

8
staircase27

提案されたすべてのソリューションは、一意のパターンを持たないスクリーン名を処理しません。 「TEST」と「TEST123」。 screen -S "TEST"またはscreen -list "TEST"を実行すると、「TEST123」という画面が表示されることがあります。 GNU screenがスクリーン名のマッチングを実装する方法に問題があります(非決定的)。

以下は、完全一致を試みてPID.SCREEN NAMEと終了コードを返すbash関数です。

function find_screen {
    if screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 -q >/dev/null; then
        screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 2>/dev/null
        return 0
    else
        echo "$1"
        return 1
    fi
}

使い方-画面を選択:

target_screen=$(find_screen "SCREEN NAME")
screen -S "$target_screen" ...etc...

使用法-画面が存在するかどうかをテストします。

if find_screen "SCREEN NAME" >/dev/null; then
    echo "Found!"
fi

とにかく、これは99,9%のケースをカバーします。 99,99%確実にするために、スクリーン名のgrep特殊文字をエスケープします。完全に一致するには、バージョンとともに進化する可能性のある括弧内の日付を含め、$までの行全体をgrepで一致させる必要があります。他の完全一致方法は次のとおりです。

ls -A -1 /var/run/screen/S-${USER} | grep "^[0-9]*\.SCREEN NAME$"

しかし、それは厄介なことであり、スクリーンの実装がこのフォルダーを使用することを確認する必要があります。この最後の方法はお勧めしません。

2
KrisWebDev

より簡単な方法は次のとおりです。

screen -xR -S SessionName

here からのStéphaneChazelasコメントからコピー:

通常、-xRを使用して、アタッチするものがない場合にアタッチまたは作成します。

そのため、セッション名がすでに存在するかどうかを検索する必要がないように、このメソッドは、存在する場合はセッションにアタッチし、存在しない場合は作成します。

0
Badr Elmers

%100仕事。

screen -list | grep "SESSİON NAME" && echo "Active Program" || echo "Passive Program"
0
Anıl Eroglu