%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
저는 액세스 권한이 있는 슈퍼컴퓨터의 대화형 노드에 로그인할 때 화면을 자주 사용하며, 종종 작업을 실행하고 계속 진행합니다. 내가 로그인할 수 있는 개별 노드는 약 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