리눅스 : 백그라운드 작업 종료


195

리눅스에서 마지막으로 생성 된 백그라운드 작업을 어떻게 죽일 수 있습니까?

예:

doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????

18
프로그래밍과 관련이없는 방법은 무엇입니까? 배쉬 프로그래밍이 프로그래밍이 아닙니까?
— flybywire

6
이것은 SO와 SU의 겹치는 영역에 있지만 SO에 더 적합하다고 생각합니다. 이런 식으로 생각하는 기준은 @flybywire가 스크립트 에서이 작업을 수행하면 프로그래밍 중이라는 것입니다. 그가 명령 줄에서 그것을하고 싶다면 SU에 속한다고 말하고 싶습니다.
— Bill the Lizard

10
쉘 스크립팅도 프로그래밍 중입니다.
— cletus

답변:


234

bash에는 이것을위한 특별한 변수가 있습니다 :

kill $!

$! 백그라운드에서 마지막으로 실행 된 프로세스의 PID로 확장됩니다.


68
@ polm23; 아니오, ^Z백그라운드 작업을하지 않고 중지합니다. 후속 bg은 실제 '백그라운드'(백그라운드에서 실행을 재개)를 수행 한 후 $!예상대로 작동합니다.
— falstro

강제 ????종료 후 실행될 하나 이상의 명령을 의미 한다고 가정합니다. 해당 명령 중 하나가 백그라운드 프로세스에 의해 수행 된 작업에 의존하는 경우 백그라운드 프로세스가 신호 처리기에서 수행 할 수있는 정리 또는 마무리 작업을 염두에 두어야합니다. (트 랩핑 가능) 신호 수신. 이러한 '종속적 인'명령 중 첫 번째 바로 앞에 ( 또는 wait뒤에) 가 추가하는 것이 가장 좋습니다. syncsleep <n>
— ack

2
완료 : 단일 %는 현재 작업을 나타내므로 "kill %"로 중지 된 작업 (^ z)을 종료 할 수 있습니다. 나는 거의 항상 ^ z 후에 이것을 사용합니다.
— t3o

이것은 작업 제어가 활성화 된 경우에만 작동하며 대화 형 쉘에서만 기본적으로 설정되어 있습니다 (ctrl-z 사용을 참조하기 때문에 대화 형 쉘 사용을 참조하는 것 같습니다)-그러나 이것은 여기에 다른 답변에 간략히 설명되어 있는데, 이것이 왜 "완전성"인지 확실하지 않습니다 :)
— falstro

289

당신은 직업 번호로 죽일 수 있습니다. 백그라운드에서 작업을 넣으면 다음과 같은 내용이 표시됩니다.

$ ./script &
[1] 35341

이는 [1]작업 번호이며 다음과 같이 참조 될 수 있습니다.

$ kill %1
$ kill %%  # Most recent background job

작업 번호 목록을 보려면 jobs명령을 사용하십시오 . 더 많은 것 man bash:

쉘에서 작업을 참조하는 방법에는 여러 가지가 있습니다. 캐릭터 %는 작업 명을 소개합니다. 작업 번호 n는이라고 할 수 있습니다 %n. 작업을 시작하는 데 사용되는 이름의 접두사를 사용하거나 명령 줄에 나타나는 하위 문자열을 사용하여 작업을 참조 할 수도 있습니다. 예를 들어, %ce중지 된 ce작업을 나타냅니다 . 접두사가 둘 이상의 작업과 일치하면 bash는 오류를보고합니다. %?ce반면 에을 사용하면 ce명령 줄에 문자열 이 포함 된 작업을 나타냅니다 . 부분 문자열이 둘 이상의 작업과 일치하면 bash는 오류를보고합니다. 기호 %%와%+쉘이 현재 작업에 대한 개념을 참조하십시오. 포 그라운드에 있거나 백그라운드에서 시작된 동안 마지막으로 중지 된 작업입니다. 이전 작업은을 사용하여 참조 할 수 있습니다 %-. 작업과 관련된 출력 (예 : jobs 명령의 출력)에서 현재 작업은 항상으로 표시되고 +이전 작업은으로 표시 -됩니다. 단일 %작업 (동봉 된 작업 스펙이 없음)도 현재 작업을 나타냅니다.


레코드의 경우 작업 제어가 활성화 된 경우에만 작동한다고 생각합니다. 스크립트 ( set -m) 에서 켤 수 있지만 대화 형으로 사용하기위한 것입니다. 참조 stackoverflow.com/questions/690266/...을 뿐만 아니라
— falstro

9
매우 유용한 기호이 %1와 %%- 특히. 일부는 Ctrl-C에서 죽지 않으므로 Ctrl-Z를 누른 다음 kill -9 %%. 내가 유용하다고 생각한 한 가지 예는 다음과 같습니다. while true; do mplayer <some unstable online radio>; date >> restarts.log; done-Ctrl-C는 다음 루프 반복으로 이동합니다. 내가 ps또는 어쩌면 하기 전에 jobs -lPID를 다시 입력하면 지루합니다.
— Tomasz Gandor

모든 직업에 대해 하나 있습니까?
— CMCDragonkai

3
교체 할 이유 @TomaszGandor 때문이다 while true와 함께 while sleep 1. 이렇게하면 다시 시작할 수 있기 때문에 잠시 지연되고 ctrl-c를 두 번 누르면 두 번째 것이 절전 모드를 중단하고 0이 아닌 종료로 종료하고 루프를 종료합니다.
— falstro 2016 년

45

다음 명령은 pid와 함께 세션의 모든 백그라운드 프로세스 목록을 제공합니다. 그런 다음이를 사용하여 프로세스를 종료 할 수 있습니다.

jobs -l

사용법 예 :

$ sleep 300 &
$ jobs -l
[1]+ 31139 Running                 sleep 300 &
$ kill 31139

25

이것은 모든 백그라운드 프로세스를 종료해야합니다.

jobs -p | xargs kill -9

1
이것은 내가 전에 사용했던 것이지만 kill -9 %%타이핑이 적습니다 :)
— Tomasz Gandor

4
@TomaszGandor 현재 작업, 즉 마지막 작업이 포 그라운드에서 중지되었거나 백그라운드에서 시작된 작업 만 종료합니다. 답변의 명령은 모든 작업을 종료합니다.
— bitek


2
skill doB

skill 주어진 기준에 따라 하나 이상의 프로세스를 선택할 수있는 kill 명령 버전입니다.


0

당신은 그것의 pid가 필요하다. 그것을 찾으려면 "ps -A"를 사용하라.


0

이것은 주제가 아닌 답변이지만 관심있는 사람들에게는 가치가 있습니다.

@ John Kugelman의 답변 에서처럼 %는 작업 사양과 ​​관련이 있습니다. 효율적으로 찾는 방법? less의 & pattern 명령을 사용하면 man bash 유형 & %에서 man이 적은 호출기를 사용하는 것 같습니다 (확실하지 않음). 그런 다음 Enter를 누르십시오.


-3

killall 명령을 사용하십시오.

killall 작업 이름

자세한 정보와 고급 옵션을 보려면 "man killall"을 입력하십시오.


4
필자는 실제로 PID에 쉽게 액세스 할 수있을 때 killall이 약간 공격적이라고 생각합니다. 특히 루트 인 경우에도 위험합니다
— Dave Vogt

3
당신이 있던 경우에 매우 도움이되지 않음, killall python또는 killall java뭔가 유용한 실행하면서하면 시스템에 알려서.
— Tomasz Gandor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.