Bash: bash 스크립트에 다른 프로세스를 호출하는 루프가 포함되어 있기 때문에 control-c가 프로세스를 종료하지 않을 때 해야 할 일: 전원 켜기/끄기 버튼에 대한 더 나은 솔루션이 있습니까?

Bash: bash 스크립트에 다른 프로세스를 호출하는 루프가 포함되어 있기 때문에 control-c가 프로세스를 종료하지 않을 때 해야 할 일: 전원 켜기/끄기 버튼에 대한 더 나은 솔루션이 있습니까?

이 질문의 전체 제목은 다음과 같습니다.

Bash: bash 스크립트에 다른 프로세스를 호출하는 루프가 포함되어 있기 때문에 control-c가 프로세스를 종료하지 않을 때 해야 할 일: 전원 켜기/끄기 버튼에 대한 더 나은 솔루션이 있습니까?

이 질문의 제목은 설명이 필요하지 않지만 다음은 좀 더 자세한 정보입니다.

다른 프로그램을 호출하는 bash 스크립트가 실행 중입니다. (다른 프로그램을 실행/실행합니다.)

이 프로그램은 데이터/곡선 피팅 프로그램으로 로 중단할 수 없습니다 CTRL-C. 그런데 이 글을 읽으면서우편, 나는 그것을 죽일 수 있다는 것을 알았습니다CTRL-\

가설적인 생각...

따라서 키보드를 으깨고 CTRL을 누른 상태에서 \키를 으깨는 것이 가능합니다.하지만어제 정말 비싼 기계식 키보드를 샀는데 다른 값싼 키보드를 살 돈이 충분하지 않다면 "으깨버릴" 의향이 있는 경우(10^6 키를 누르는 것을 모두 사용하고 싶지 않기 때문입니다) 반짝이는 새 기계식 키보드가 닳기 전에 가지고 있어야 함) 또는 집이 다음 중 하나이기 때문에 집에서 오래된 키보드를 찾을 시간이 충분하지 않습니다.극도로무질서(엉망) 또는 칩팬 화재 등 긴급 상황이 동시에 발생하는 경우...

또한 루프가 이 피팅 프로그램을 호출하고 아마도 1000개의 데이터 파일을 피팅하는 경우 \키를 1000번 누르는 데 시간이 오래 걸릴 수 있습니다.

초공간 생각...

또는; bash 스크립트에서 실수를 했고 실제로 무한 루프를 실행하고 있다면 어떻게 될까요?

이 상황에서 상위 스크립트 실행을 중지하려면 어떻게 해야 합니까? 컴퓨터의 플러그를 뽑거나, 전원 버튼을 10초 동안 눌러 끄거나, 불 속에 던져서 작동을 멈출 수 있지만, 이러한 솔루션은 발생할 수 있는 데이터 손실 가능성 때문에 무의미해 보입니다.

이론적으로는 시스템 모니터를 실행하고 bash 프로세스를 종료할 수 있지만 모두 동일한 이름을 가진 프로세스가 많으면 찾기 어려울 수 있습니다. 또한 단일 코어 컴퓨터 또는 N 코어가 있고 모두 100% CPU를 사용하려고 하는 N 프로세스를 실행하는 멀티코어 컴퓨터입니다. 아니면 단 하나의 프로세스가 4GB 이상의 RAM을 사용하고 있어서 컴퓨터가 그 이유 때문에 극도로 느려질 수도 있습니다. 적어도 지금은 시스템 모니터를 실행하기에는 너무 느립니다. 그 다음으로 좋은 옵션은 CTRL-ALT-F1을 누르고 루트로 로그인을 시도한 다음 다음을 사용하여 문제가 되는 bash 상위 항목을 찾는 것입니다 ps -A. kill PID하지만 다시 말하지만, 컴퓨터의 로드가 너무 많으면 시간이 몇 분 정도 걸릴 수 있습니다. 교환하기 위해 계속해서 쓰고 있다는 것입니다.

SIG TERM exec cpu_broken.sh; 재소집; 명확한 화면; 명확한 Think_Process; 계속하다...

더 나은 해결책이 있습니까?

답변1

따라서 기본적으로 모든 것에 액세스할 수 없게 만드는 스크립트를 실행하고 이를 중지하기 위한 빠르고 쉬운 솔루션을 원합니다. 전원을 껐다 켜는 대신 SYSRQ키(대부분의 경우 키와 동일 )를 누른 상태에서 , , , , , PRTSC을 하나씩 누르는 것입니다 . 기본적으로 이는 실행 중인 모든 프로세스를 종료하고 시스템을 다시 시작하는 안전한 방법입니다.REISUB

이에 대한 대안은 sudo nano /proc/sysrq-trigger해당 파일에 do , b 를 쓰고 저장하는 것입니다. 시스템이 즉시 다시 시작됩니다

더 많은 정보: https://en.wikipedia.org/wiki/Magic_SysRq_key

답변2

전체 프로세스 그룹을 종료해야 합니다. 프로세스 그룹 ID(PGID)는 그룹을 시작한 프로세스의 PID입니다. 프로세스 그룹을 종료하려면 프로세스 그룹을 시작한 프로세스의 PID, 즉 모든 것을 시작한 스크립트나 명령을 찾아야 합니다. 구문은 다음과 같습니다.

kill -- -PGID

예를 들어:

kill -- -1234

여기서 1234는 PGID(프로세스 그룹 ID)입니다.

그러면 프로세스 그룹의 모든 프로세스에 SIGTERM이 전송됩니다. SIGKILL(9)과 같은 다른 신호를 보내려면 다음을 수행하십시오.

kill -9 -1234

PGID를 찾는 방법:

넌 할 수있어:

ps -eo 'pid,ppid,pgid,cmd'

그러면 PID, PPID(상위 프로세스 ID), PGID 및 프로세스 이름이 표시됩니다.

이제 grep다른 적절한 방법을 사용하여 PGID를 찾은 다음 위에서 언급한 방법으로 PGID를 종료할 수 있습니다.

PPID를 표시하는 명령을 만든 이유는 다음과 같이 PPID 일치를 기반으로 프로세스를 종료하려고 시도할 수도 있기 때문입니다 pkill.

pkill -P PPID

예를 들어:

pkill -P 6789

이 방법을 사용하려면 모든 상위(및 하위 프로세스)를 찾아 종료해야 합니다. 따라서 모든 프로세스를 종료하려면 전체 프로세스 트리를 종료하는 것이 더 나은 방법이라고 생각합니다.

답변3

top일반적으로 , htop또는 유사한 방법을 사용하여 프로세스를 찾아 종료할 수 있습니다(또는 프로세스의 이름이나 PID를 알고 있는 경우 등을 수행할 수 killall있습니다 pkill). 예를 들어 를 사용하면 터미널에서 실행 중인 스크립트를 선택하고 +를 top눌러 종료할 수 있습니다 .kEnter

여기에 이미지 설명을 입력하세요

그래도 작동하지 않으면 k+ 9+는 EnterSIGKILL 신호를 사용해야 합니다. SIGKILL은 프로세스가 즉시 종료되도록 요청하고 SIGTERM처럼 프로세스가 리소스 정리 등을 마칠 때까지 기다리지 않습니다. Ctrl+ C프로세스는 SIGTERM처럼 프로세스를 중단하기 위해 SIGINT만 보냅니다.

htop의 트리 보기(누르기 t)를 사용하면 스크립트의 상위 프로세스를 결정하고 해당 프로세스를 종료하여 루프가 계속되지 않도록 할 수 있습니다.

또한보십시오:

관련 정보