화면 세션 이름의 반복 목록을 얻는 방법

화면 세션 이름의 반복 목록을 얻는 방법

루프를 사용하여 일련의 직렬 포트에 연결된 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. 교체를 사용하여 해당 지점 이전의 모든 항목을 제거할 수 있지만 전체 콘텐츠를 사용하여 screen 세션에 다시 연결할 수 있는 것으로 나타났습니다 PID.sessionName.

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

관련 정보