모든 화면 세션을 자동 순환(닫기)하는 방법

모든 화면 세션을 자동 순환(닫기)하는 방법

저는 액세스 권한이 있는 슈퍼컴퓨터의 대화형 노드에 로그인할 때 화면을 자주 사용하며, 종종 작업을 실행하고 계속 진행합니다. 내가 로그인할 수 있는 개별 노드는 약 20개입니다. 그 중 하나를 선택하면 4개의 분리된 세션이 있게 됩니다. 각 세션에는 아마도 5개의 스크린 세션이 있을 것입니다.

이 모든 과정을 순환하고 프로세스가 실행되지 않는 경우 종료하는 빠른 방법이 있습니까? 현재 프로세스는 기본 화면으로 돌아올 때까지 입력 screen -ls한 다음 screen -r ####입력하는 것입니다.exit

편집하다

Thor의 답변을 기반으로 한 스크립트는 다음과 같습니다.

for screen_pid in $(screen -ls | sed -nr 's/^\t+([0-9]+).*/\1/p');
do 
  for shell_tty in $(ps h --ppid $screen_pid -o tty);
  do
    number_of_processes=$(ps a -o tty | grep $shell_tty | wc -l)
    if (( number_of_processes > 1 )); then 
      echo number $number_of_processes
    else
      # screen -S $screen_pid -X kill  
      screen -S $screen_pid -X quit
    fi
  done
done

kill로 실행하면 세션에 아무 일도 일어나지 않는 것 같습니다. quit으로 실행하면 실행 중인 프로세스가 있는지 확인하지 않고 전체 세션과 내부에서 실행 중인 모든 항목이 종료되는 것처럼 보입니다. 여기에서 조정?

답변1

한 가지 옵션은 프로그램을 화면 기본 명령으로 실행한 다음 작업이 완료되면 화면이 종료되는 것입니다.

위의 내용이 유용하지 않은 경우 쉘 tty에 연결된 프로세스 수를 확인하여 실행 중인 프로세스 수를 추정할 수 있습니다.

몇 가지 숙어가 필요합니다.

다음에서 화면 pid를 추출합니다 screen -ls.

screen -ls | sed -nr 's/^\t+([0-9]+).*/\1/p'

해당 pid를 부모로 갖고 있는 사람을 검색합니다.

ps h --ppid $screen_pid -o tty

해당 tty에 연결된 프로세스 수를 확인하세요.

ps a -o tty | grep $shell_tty | wc -l

함께 모아서

screen -ls | sed -nr 's/^\t+([0-9]+).*/\1/p' | while read screen_pid; do
  shell_tty=$(ps h --ppid $screen_pid -o tty)
  number_of_processes=$(ps a -o tty | grep $shell_tty | wc -l)
  if (( number_of_processes > 1 )); then
    # more than the shell is running
  else
    # can be killed
  fi
done

관련 정보