예를 들어,
#!/bin/bash
while :
do
sl
done
이 bash 스크립트를 종료하는 방법은 무엇입니까?
답변1
Ctrl-Z
일시 정지 스크립트 누르기kill %%
프로세스 ID가 아닌 현재 셸에서 가장 최근에 일시 중지된 백그라운드 작업에 신호(기본적으로 SIGTERM)를 보내고 싶다고 %%
bash 내장 기능에 알립니다 .kill
번호나 이름으로 작업을 지정할 수도 있습니다. 예를 들어 ^Z로 작업을 일시 중지하면 bash는 다음과 같은 것을 사용하여 작업 번호를 알려줍니다. [n]+ Stopped
여기서 n
작업 번호는 대괄호 안에 있습니다.
작업 제어 및 작업 종료에 대한 자세한 내용을 보려면 bash 또는 bash 매뉴얼 페이지 에서 help jobs
, help fg
, help bg
및 (모두 대문자)를 help kill
검색하십시오 .JOB CONTROL
jobspec
예를 들어
$ ./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
의도적으로 무시합니다 . 따라서 먼저 매개변수를 추가하여 무시하지 않도록 알려주어야 합니다 .SIGINT
Ctrl+Csl
SIGINT
-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>
두 방법 모두 요구 사항을 충족해야 합니다.