명령줄에서 kill bash 루프 실행

명령줄에서 kill bash 루프 실행

루프에서 명령을 실행합니다. bash 명령줄에 직접 루프를 작성합니다.

$ while true; do mycommand; done

mycommandIO를 많이 수행하고 이벤트를 기다리는 명령이므로 프로세서 시간을 너무 많이 소모하지 않습니다.

루프를 어떻게 끊을 수 있나요? ctrl-c또는 키를 누르면 ctrl-\명령이 종료되지만 즉시 다시 시작됩니다. 다른 터미널에 로그인하여 명령을 종료해도 상황은 동일합니다.

터미널 세션을 종료하지 않고 루프를 끊을 수 있습니까?

답변1

대화형으로 시작된 루프를 종료하는 간단한 방법은 중지 명령( Ctrl- Z)입니다. 이 명령은 작업 번호(예: )를 인쇄한 [2]+ Stopped다음 로 루프를 종료할 수 있습니다 kill %2.

답변2

ps -f를 원합니다. pstree도 매우 유용합니다. PPID(상위 PID)를 확인하세요.

$ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
rui       7725  7722  0 13:30 pts/0    00:00:01 -bash
rui       8062  7725  0 14:09 pts/0    00:00:00 ps -f

$pstree-g

├─starter(1600)───charon(1603)─┬─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon} (1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ └ ─{카론}(1603)

답변3

약간의 배경지식:

귀하의 명령은 mycommandSIGINT를 수신할 때 다시 보내지 않으며 단지 종료됩니다. 그러므로, bash런 루프의 인스턴스는 실행을 종료하기 위해 CTRL어떤 +가 C사용되는지 결정할 수 없으며, 그것이 단지 사용자가 실행한 키보드 단축키라고 가정합니다 mycommand. 키보드 단축키(예: 사용 상상)로 인해 vi쉘을 종료하는 것은 바람직하지 않으므로 bash다른 루프 반복을 계속하십시오.

mycommand최종 해결책은 SIGINT를 받으면 스스로 종료되도록 수정 하고 bash중지해야 한다고 알리는 것이었습니다.

void sigint_handler(int sig)
{
    // Execute your normal handler
    signal(SIGINT, SIG_DFL); // don't catch the signal anymore
    kill(getpid(), SIGINT); // kill itself with the same signal
}

원천:http://www.cons.org/cracauer/sigint.html

문제를 해결할 수 없는 경우 mycommand터미널 세션을 닫거나 bash프로세스의 현재 인스턴스와 순서대로 실행되는 루프를 종료해야 합니다.mycommand

관련 정보