画面セッション名の繰り返しリストを取得する方法

画面セッション名の繰り返しリストを取得する方法

ループを使用して、一連のシリアルポートに接続されたBashを使用して一連の画面を作成しました。

for i in $(ls /dev/ttyACM*)
do
    screen -S ${i##*/} -L -d -m $i
done

その後、画面がすべて終了するまで、すべての画面にリセットコマンドを繰り返し送信したいと思います(一部のデバイスでは、再起動するには何度もリセットする必要があります)。これを行うには、アクティブな画面セッション名のリストが必要です。

残念ながら、このようなコマンドはfor j in $(screen -ls); do echo $j; done次を返します。

There
are
screens
on:
33097.ttyACM6
(17.05.2021
18.53.46)
(Detached)
33085.ttyACM0
(17.05.2021
18.53.46)
(Detached)
2
Sockets
in
/run/screen/S-keir.finlowbates.

私が望むのは、次を返す次のコマンドです。

ttyACM6
ttyACM0

その後、次を実行できます。

for i in $(<<magic stuff here>>)
    screen -S ${i##*/} -X stuff 'reset^M'
done

画面がもう残らなくなるまで。

<<ここにある魔法のもの>>を助ける人いますか?

答え1

screen -ls形式で印刷

There are screens on:
    screen_name    (Status)
X Sockets in /path/to/screen/socket/dir

特定の出力は次のようになります。

There are screens on:
    33097.ttyACM6    (17.05.2021 18.53.46)   (Detached)
    33085.ttyACM0    (17.05.2021 18.53.46)   (Detached)
2 Sockets in /run/screen/S-keir.finlowbates.

したがって、値を繰り返すforループを作成すると、スペースで区切られた各項目のみがエコーされます。

すべての画面が提供した形式と一致し、関連するttyがあると仮定すると、この情報を取得する最も簡単な方法はを実行することですscreen -ls | grep "tty"| awk '{print $1}' | cut -d. -f 2

screen -ls上記の結果を返し、grep ttyttyを含む行のみを返し、awk {print $1}その行の最初の列を印刷し、cut -d. -f2区切り文字をaに設定.し、フィールド2(この場合はtty値)を返します。

あなたの例では、以下が返されます。

ttyACM6
ttyACM0

答え2

きちんとした形式の結果は返されませんが、screenLinuxファイルシステムを照会して必要な情報を取得できることがわかりました。

ls /var/run/screen/S-${USER}

これにより、PIDと画面セッション名が返されます(例:)443653.ttyACM6 443818.ttyACM6。置換を使用してそのポイントより前のすべてのアイテムを削除できますが、コンテンツ全体を使用してスクリーンセッションに再接続できることがわかりましたPID.sessionName

for i in $(ls /var/run/screen/S-${USER})
  do
    screen -r ${i} -X stuff 'reset^M'
  done

関連情報