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


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.