루프를 사용하여 일련의 직렬 포트에 연결된 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
. 교체를 사용하여 해당 지점 이전의 모든 항목을 제거할 수 있지만 전체 콘텐츠를 사용하여 screen 세션에 다시 연결할 수 있는 것으로 나타났습니다 PID.sessionName
.
for i in $(ls /var/run/screen/S-${USER})
do
screen -r ${i} -X stuff 'reset^M'
done