백그라운드 프로세스를 종료하는 방법?


196

을 사용하여 백그라운드에서 원격 컴퓨터에서 wget을 시작했습니다 &. 갑자기 다운로드가 중지됩니다. 프로세스를 종료 한 다음 명령을 다시 실행하고 싶습니다. 어떻게 종료합니까?

쉘 창을 닫지 않았습니다. 그러나 아시다시피 Ctrl+ CCtrl+ 사용은 중단되지 않습니다 Z.

답변:


256

이 문제를 해결하는 방법에는 여러 가지가 있습니다.

방법 # 1-ps

ps명령을 사용 하여이 프로세스의 프로세스 ID를 찾은 다음 PID를 사용하여 프로세스를 종료 할 수 있습니다.

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

방법 # 2-pgrep

을 사용하여 프로세스 ID를 찾을 수도 있습니다 pgrep.

$ pgrep wget
1234

$ kill 1234

방법 # 3-pkill

확실하게 wget실행 한 것이 확실하다면 명령 pkill을 사용하여 이름으로 작업을 종료 할 수 있습니다 .

$ pkill wget

방법 # 4-직업

현재 백그라운드에서 작업을 실행 한 곳과 동일한 쉘에있는 경우 jobs명령을 사용하여 여전히 실행 중인지 확인 하고 작업 번호로 종료 할 수도 있습니다.

내 가짜 일, sleep.

$ sleep 100 &
[1] 4542

직업 번호를 찾으십시오. 참고 : 번호 4542는 프로세스 ID입니다.

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

방법 # 5-fg

fg명령을 사용하여 백그라운드 작업을 다시 포 그라운드로 가져올 수 있습니다 .

가짜 직업, sleep.

$ sleep 100 &
[1] 4650

직업 번호를 얻으십시오.

$ jobs
[1]+  Running                 sleep 100 &

작업 # 1을 다시 포 그라운드로 가져온 다음 Ctrl+ 를 사용하십시오 C.

$ fg 1
sleep 100
^C
$

jobs전혀 없습니다 outputfg SAIS을 : -bash: fg: 1: no such job. 그러나 입력 fg은 잘 작동하고 잘 pkill wget작동합니다. 하지만 ps -eaf|grep wget다음 kill <process number>작업을 중단하지 복용량. 추신 : 나는 프로세스 번호 로 세 번째 숫자를 사용합니다 .
Mohammad Etemaddar

1
@MohammadEtemaddar-출력에서 두 번째 숫자를 사용하십시오 ps. 세 번째 #은 부모의 프로세스 ID입니다.
slm

1
@MohammadEtemaddar-아, ps는 grep을 찾고 있습니다. 다음과 같이하십시오 : ps -eaef| grep [w]get.
slm

1
@MohammadEtemaddar- pgrep대신 사용할 수도 있습니다 pgrep wget.
slm

2
@MohammadEtemaddar-여분의 전자가 오타입니다. 읽어야 ps -eaf | grep [w]get합니다. 옵션은 ps매뉴얼 페이지에 있습니다. man ps.
slm

70

bash에서는 fg작업을 포 그라운드로 가져오고 Ctrl+ 를 사용할 수 있습니다.C

또는 백그라운드에서 프로세스를 나열한 jobs다음 수행하십시오.

kill %1

(1을 숫자로 대체 jobs하면 나타납니다)


13

kill $!가장 최근에 백그라운드 작업을 종료 하는 데 동일하게 사용할 수 있습니다 .


bash 프로파일의 별명과 같은 명령으로 사용되는 경우 작은 따옴표로 묶어야합니다.
네이트 리터

6

편집 : 포 그라운드에서 Ctrl+ C또는 또는 @Zelda가 언급했듯이 '% x'로 죽일 수 있습니다. 여기서 'x'는 작업 번호가 기본 신호를 보냅니다 (Linux의 경우 SIGTERM).

fg마지막으로 프로세스 한 프로세스 인 경우 '&'로 포 그라운드로 가져 오려면 입력 하십시오.

마지막이 아닌 경우 :를 입력 jobs하고 '[]'로 표시된 '작업 번호'를 찾으십시오. 그런 다음 다음을 입력하십시오.

fg 2

.. 여기서 '2'는 작업 번호입니다 (예 :

foo@bar:~/junk/books$ jobs
[1]+  Running                 okular how_to_cook_a_turkey.pdf &
foo@bar:~/junk/books$ fg 1
okular how_to_cook_a_turkey.pdf            <- this is now in the foreground.

4

올바른 방법은 입력 jobs한 다음 작업 번호를 사용하여 종료하는 것입니다. pid를 사용하여 죽이려면 첫 번째 답변에서 언급 한 것처럼 pid를 포 그라운드로 가져와야합니다.

이 시도

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

작업을 종료 한 직후 작업을 실행하면 다음을 볼 수 있습니다

Desktop$ jobs
[1]+  Terminated              sleep 1000

4

내가 보지 못한 것 중 하나는 명령을 테스트 할 때 특히 유용하다는 것입니다 pidof. pidof [command]현재 실행중인 프로세스의 프로세스 ID를 찾는 데 사용할 수 있습니다 . 원하는 명령의 ID를 신속하게 찾을 수 있기 때문에 마음에 듭니다. 일반적으로 방금 호출 한 것입니다.

일단 pid가 있으면 간단히 프로세스를 종료 할 수 있습니다. 프로세스가 현재 실행중인 경우에만 프로세스를 종료하기위한 간단한 스크립트를 작성할 수 있습니다.


1
아 도움이되었습니다! 어떤 이유로 인해 kill % 1이 작동하지 않았습니다. "kill : 인수 : '% 1'을 (를) 구문 분석하지 못했습니다."Ctrl + C가 작동하지 않았습니다. PS 또는 아무것도가 루트 이었기 때문에의 과정을 찾을 수 없습니다 (나는 그것으로 sudo를 사용 잊었)
mjohnsonengr

1

일반적인 예는 stress도구입니다. 다음을 실행했다고 가정 해 봅시다.

$ stress -c 4 -m 4 

터미널 창을 닫았습니다. 프로세스는 백그라운드에서 계속 리소스를 먹습니다.

그녀는 내가하는 일 :

$ x=`pgrep stress` ; sudo kill -9 $x 

pgrep처리 된 프로세스의 PID를 나열하고이를 종료하는 x데 사용되는 변수에 저장 kill -9합니다.


0

bash 마지막으로 중지 된 프로세스 (Ctrl-Z)에서 다음을 통해 죽일 수 있습니다.

kill %%
kill -9 %%

또는 선택하려면 다음을 사용하십시오.

jobs

그때:

kill %N

처럼 kill %2

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