터미널에서 루프 bash 스크립트를 중지하는 방법은 무엇입니까?


54

예를 들어

#!/bin/bash
while :
do
    sl
done

이 bash 스크립트를 종료하는 방법?


1
자세한 내용을 제공하십시오. 대화식 또는 프로그래밍 방식으로 중지 하시겠습니까?
manatwork

1
당신은 누를 수 ctrl-c보내 SIGINT(대부분의 쉘에서) 신호를하거나 눌러 ctrl-z즉 전송 SIGTSTP(대부분의 쉘에서) 신호를. 누른 ctrl-z경우 관련 프로세스가 종료되지 않고 일시 중지됩니다. 당신은 fg(최소한에 bash)
user1146332로

아니요, 작동하지 않습니다!
Yinyanghu

4
문제는 대본이 아니라 sl내가 틀린 철자 명령 인 철자 명령이라고 생각 ls합니다. 내가 아는 한 SIGINT신호를 포착 하고로 종료해야합니다 SIGKILL.

1
감사. 내 배포판으로 포장되지 않았으므로 알지 못했던 것입니다. (요청을하지 않겠다고 생각합니다.)
manatwork

답변:


63

프로그램은 sl의도적으로 무시합니다 .이 키 SIGINT를 누르면 전송됩니다 Ctrl+C. 따라서 먼저 인수 를 추가하여 sl무시하지 말라고 지시 해야합니다 .SIGINT-e

이 방법을 시도하면 각 개인을 중지 할 수 sl있지만 여전히 반복됩니다. 당신 은 또한 bash종료 후 알려야 합니다 SIGINT. trap "exit" INT루프를 앞에 두어이 작업을 수행 할 수 있습니다 .

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

5
확인을 위해 설치하지는 않았지만 Ctrl- \에서 SIGQUIT로 죽일 수도 있습니다.
derobert

120
  1. Ctrl-Z스크립트를 일시 중지하려면을 누르십시오
  2. kill %%

이 명령 %%은 bash 내장 kill에 프로세스 ID가 아니라 현재 쉘에서 가장 최근에 일시 중단 된 백그라운드 작업에 신호 (기본적으로 SIGTERM)를 보내도록 지시합니다 .

번호 나 이름으로 작업을 지정할 수도 있습니다. 당신이 ^ Z와 작업을 중단 할 때 예를 들면, 배쉬는 작업 번호가 같은과 무엇이 당신을 말할 것이다 [n]+ Stopped, n대괄호 안에이 작업 번호입니다.

실행 작업 제어에 죽이는 작업에 대한 추가 정보를 보려면 help jobs, help fg, help bg, 그리고 help killbash는, 및 검색 JOB CONTROL(모두 대문자) 또는 jobspecbash는 남자 페이지에서.

예 :

$ ./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
$ 킬 %%
$ 
[1] + 종료 됨 ./killme.sh

이 예에서 작업 번호는 1이므로 kill %1다음과 동일하게 작동 했을 것입니다.kill %%

(참고 : sl설치 하지 않았 으므로 출력은 "명령을 찾을 수 없음"입니다. 귀하의 경우 sl 출력이 무엇이든 얻을 수 있습니다. 중요하지 않습니다- ^Z일시 중단과 kill %%동일하게 작동합니다)


3
또 다른 좋은 대답!
Yinyanghu

2
BTW는 이와 같은 루프를 빠르게 실행하기 위해 ^ Z가 ^ C보다 프로세스를 종료하는 데 더 안정적인 방법 일 수 있습니다. ^ C는 sl루프에서 실행되는 프로그램 ( )으로 보내지 지만 스크립트는 계속 실행되고 다른 시작 sl됩니다. ^ C를 몇 번이나 빠르게 누르면 sl, 스크립트와 스크립트를 모두 죽일 수 있습니다 (둘 중 어느 것도 SIGINT 를 잡지 않으면 ). ^ Z는 스크립트를 거의 즉시 중단 할 것입니다 (여전히 터미널로 인쇄되는 버퍼링 된 출력을 세지 않으면)kill %%
cas

바로 그거죠! 나는 " sl재미있는 프로그램이다" 라고 말해야 합니다. 이번에는 또 재미 있어요! @ _ @
Yinyanghu

루프가 스크립트에서 호출되지 않고 명령 줄에서 직접 호출 될 때도 작동하는 것처럼 보입니다.
Skippy le Grand Gourou

1
@DrewChapin 언제 / 어디에 대해 알게되었는지 기억이 안납니다. "영원히"부터 알고있었습니다. bash 매뉴얼 페이지 ( jobspec 검색 )는 말합니다 :The symbols %% and %+ refer to the shell's notion of the current job, which is the last job stopped while it was in the foreground or started in the background. The previous job may be referenced using %-. If there is only a single job, %+ and %- can both be used to refer to that job
cas

6

ctrl + c를 사용하여 루프를 중지하고 스크립트를 종료하지 않으려면 || break실행중인 명령 뒤에 배치 할 수 있습니다 . 실행중인 프로그램이 ctrl + c에서 종료되는 한 이것은 잘 작동합니다.

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

중첩 루프 상태 인 경우 "break 2"를 사용하여 두 수준 등을 벗어날 수 있습니다.


휴식 시간 2를 더한 1
날기

3

이 스크립트를 시작한 터미널에서 Ctrl + C를 눌러 해당 스크립트를 종료 할 수 있습니다. 물론이 스크립트는 포 그라운드에서 실행해야하므로 Ctrl + C로 중지 할 수 있습니다.

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

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

두 가지 방법 모두 당신이 요구하는 트릭을 수행해야합니다.


1
터미널에서 Ctrl + C로 종료 할 수 없습니다. 그래서 나는 ps 또는 top으로 그것을 죽여야합니다. 나는 단지 그것을 직접 죽이는 방법을 알고 싶다!
Yinyanghu

3

가장 쉬운 방법은 QUIT일반적으로에 첨부 된 신호 를 발행하는 것 Control-Backslash입니다.

열차가 보이면 Control- \를 누르십시오.


1

할 수 있습니다 쉘 (bash에). 방금 시도했지만 작동합니다. (루핑 스크립트에서 실행하는 작업) 의 프로세스를 볼 수 없기 때문 입니다.killpid

ps -ef


0

전체 스크립트를 종료하는 또 다른 방법은 sl명령 을 백그라운드로 설정 한 다음 신호 INT를 사용하여 스크립트의 전체 프로세스 그룹을 signal로 종료하는 것 HUP입니다.

#!/bin/bash

trap 'trap - INT; kill -s HUP -- -$$' INT
#trap 'trap - INT; kill -s HUP 0' INT

while :
do
   sl & wait
done


-1
while [ true ] 
do

  #check if script is running
  ps | grep script_name.sh | grep -v grep >/dev/null 2>&1

  if [ "$!" != "0" ] ; then
    break
  else

    kill -9 ` ps -ef | grep script_name.sh | cut -d "a" -f 1` 
    echo "kill -9 `get script PID`"

  fi

done

도움이 될 것입니다.


2
마지막 백그라운드 명령의 PID가 왜 0이라고 생각합니까?
manatwork

-1

스크립트를 두 번 실행 해야하는 경우 지금은 결코 없기 때문에 살해는 끔찍합니다. 종료 코드가 잘못되었습니다.

while [ something ]; do

 if [ somethingelse ]; then
   echo shut down script with exit code 0
   exit 0
 fi
done

echo something else not happend
exit 2 # Return val important for example for monitoring

더 작동하지 않습니다. 해결책 = 펄을 사용하십시오. 자신의 bash를 여는 동안

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.