ループを使用して、一連のシリアルポートに接続された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 tty
ttyを含む行のみを返し、awk {print $1}
その行の最初の列を印刷し、cut -d. -f2
区切り文字をaに設定.
し、フィールド2(この場合はtty値)を返します。
あなたの例では、以下が返されます。
ttyACM6
ttyACM0
答え2
きちんとした形式の結果は返されませんが、screen
Linuxファイルシステムを照会して必要な情報を取得できることがわかりました。
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