別のbashファイルを一意の名前でデタッチされた画面で起動するbashファイルを作成しました。その内部bashファイルのインスタンスが1つだけ実行されていることを確認する必要があります。これを行うには、親bashファイルをチェックして、その名前の画面が存在するかどうかを確認してから、作成を試みます。これを行う方法はありますか?
screen -list
の出力を確認して、チェックしているセッションの名前を取得できます。
if ! screen -list | grep -q "myscreen"; then
# run bash script
fi
特定のセッションの画面「select」コマンドを照会できます。セッションが存在する場合、シェルの結果は「0」であり、名前付きスクリーンセッションが見つからない場合は「1」です。
$ screen -S Tomcat $ screen -S Tomcat -Q select。 ;エコー$? 0
対:
$ screen -S Jetty -Q select。 ; echo $? スクリーンセッションが見つかりません。 1
'.'
の後のselect
はオプションですが、より堅牢な場合があります。
コメントできないので、これを新しい回答として投稿しています。トロイフォルガーの答えは良い考えであり、基本的にセッションにほとんど何もしないコマンドを送信して送信することになります。 1つの問題は、screen -Qの一部の(古い)バージョンではサポートされていないため、これらのバージョンでは正しいコマンドが
screen -S Jetty -X select . ; echo $?
コマンド「select」を送信します。 「ジェティ」と呼ばれるスクリーンセッションに。
選択すると、アクティブなウィンドウとが変わります。これは現在アクティブなウィンドウを意味するので、これはアクティブウィンドウを現在アクティブなウィンドウに変更しようとすることを意味します。これは、接続するセッションがない場合にのみ失敗する可能性があります。
あなたがそれよりも情報ドキュメントを読んだ場合は、selectの唯一の使用を推奨します。テストとして、または何かが選択されていることを確認するために-Xを使用します。
提案されたすべてのソリューションは、一意のパターンを持たないスクリーン名を処理しません。 「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$"
しかし、それは厄介なことであり、スクリーンの実装がこのフォルダーを使用することを確認する必要があります。この最後の方法はお勧めしません。
より簡単な方法は次のとおりです。
screen -xR -S SessionName
here からのStéphaneChazelasコメントからコピー:
通常、-xRを使用して、アタッチするものがない場合にアタッチまたは作成します。
そのため、セッション名がすでに存在するかどうかを検索する必要がないように、このメソッドは、存在する場合はセッションにアタッチし、存在しない場合は作成します。
%100仕事。
screen -list | grep "SESSİON NAME" && echo "Active Program" || echo "Passive Program"