루프에서 명령을 실행합니다. bash 명령줄에 직접 루프를 작성합니다.
$ while true; do mycommand; done
mycommand
IO를 많이 수행하고 이벤트를 기다리는 명령이므로 프로세서 시간을 너무 많이 소모하지 않습니다.
루프를 어떻게 끊을 수 있나요? 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
약간의 배경지식:
귀하의 명령은 mycommand
SIGINT를 수신할 때 다시 보내지 않으며 단지 종료됩니다. 그러므로, 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