터미널에서 bash 스크립트 반복을 중지하는 방법은 무엇입니까?

터미널에서 bash 스크립트 반복을 중지하는 방법은 무엇입니까?

예를 들어,

#!/bin/bash
while :
do
    sl
done

이 bash 스크립트를 종료하는 방법은 무엇입니까?

답변1

  1. Ctrl-Z일시 정지 스크립트 누르기
  2. kill %%

프로세스 ID가 아닌 현재 셸에서 가장 최근에 일시 중지된 백그라운드 작업에 신호(기본적으로 SIGTERM)를 보내고 싶다고 %%bash 내장 기능에 알립니다 .kill

번호나 이름으로 작업을 지정할 수도 있습니다. 예를 들어 ^Z로 작업을 일시 중지하면 bash는 다음과 같은 것을 사용하여 작업 번호를 알려줍니다. [n]+ Stopped여기서 n작업 번호는 대괄호 안에 있습니다.

작업 제어 및 작업 종료에 대한 자세한 내용을 보려면 bash 또는 bash 매뉴얼 페이지 에서 help jobs, help fg, help bg및 (모두 대문자)를 help kill검색하십시오 .JOB CONTROLjobspec

예를 들어

$ ./killme.sh
./killme.sh: 4행: sl: 명령을 찾을 수 없음
./killme.sh: 4행: sl: 명령을 찾을 수 없음
./killme.sh: 4행: sl: 명령을 찾을 수 없음
./killme.sh: 4행: sl: 명령을 찾을 수 없음
./killme.sh: 4행: sl: 명령을 찾을 수 없음
...
...
...
./killme.sh: 4행: sl: 명령을 찾을 수 없음
^Z
[1]+ 중지됨./killme.sh
$kill%%
$
[1]+ ./killme.sh 종료

이 예에서는 작업 번호가 1이므로 다음 kill %1과 같이 작동합니다.kill %%

(참고: 설치하지 않았 sl으므로 출력은 단지 "명령을 찾을 수 없음"입니다. 귀하의 경우 sl이 생성하는 모든 출력을 얻게 됩니다. 상관없습니다. 중단해도 ^Z동일 kill %%하게 작동합니다.)

답변2

프로그램은 귀하가 정시에 전송되는 것을 sl의도적으로 무시합니다 . 따라서 먼저 매개변수를 추가하여 무시하지 않도록 알려주어야 합니다 .SIGINTCtrl+CslSIGINT-e

이것을 시도하면 모든 사람을 차단할 수 있지만 sl여전히 중복된다는 것을 알게 될 것입니다. bash퇴실 후에도 알려주셔야 합니다 . 루프 앞에 를 배치하여 이를 수행 SIGINT할 수 있습니다 .trap "exit" INT

#!/bin/bash
trap "exit" INT
while :
do
    sl -e
done

답변3

ctrl+c를 사용하여 루프를 중지하고 스크립트를 종료하지 않으려면 || break실행 중인 명령 뒤에 이를 입력할 수 있습니다. 실행 중인 프로그램이 Ctrl+C를 통해 종료되는 한 제대로 작동합니다.

#!/bin/bash
while :
do
    # ctrl+c terminates sl, but not the shell script
    sl -e || break
done

중첩 루프에 있는 경우 "break 2"를 사용하여 두 레벨을 종료할 수 있습니다.

답변4

이 스크립트를 시작한 터미널에서 Ctrl+C를 눌러 이 스크립트를 종료할 수 있습니다. 물론 이 스크립트는 Ctrl+C를 통해 중지할 수 있도록 전경에서 실행되어야 합니다.

또는 다음을 통해 다른 열려 있는 터미널에서 스크립트의 PID(프로세스 ID)를 찾을 수 있습니다.

ps -ef | grep <name_of_the_script>
kill -9 <pid_of_your_running_script>

두 방법 모두 요구 사항을 충족해야 합니다.

관련 정보