nohup 프로세스를 종료하기 위해 프로세스 ID를 얻는 방법은 무엇입니까?


204

서버에서 nohup 프로세스를 실행 중입니다. 그것을 죽이려고하면 퍼티 콘솔이 대신 닫힙니다.

이것이 프로세스 ID를 찾는 방법입니다.

ps -ef |grep nohup 

이것은 죽이는 명령입니다

 kill -9 1787 787

6
스크립트 나 명령 줄에서 죽이려고합니까? PID를 저장하고 nohup나중에 사용할 때 PID를 저장 kill하거나 ps -ef출력 에서 명령 이름으로 프로세스를 찾아 PID를 가져와야합니다. 이 아닌 명령 이름을 찾아야합니다 nohup.
lurker 2018 년

1
@mbratch 주석 대신 답을 만들어야합니다.
Ansgar Wiechers 2018 년

@AnsgarWiechers 제안에 감사드립니다. 때로는 내 답변이 매우 짧거나 OP가 요구하는 내용을 완전히 다루고 있는지 확실하지 않은 경우 답변으로 게시하는 것을 주저합니다. 답변을 추가하고 더 많은 정보를 포함 시켰습니다.
lurker

답변:


353

사용하는 경우 nohup당신은 백그라운드에서 작업을 넣어, 배경 연산자 ( &) 프롬프트 명령에 당신에게 PID를 제공 할 것입니다. 계획이 프로세스를 수동으로 관리하려는 경우 PID를 저장하고 나중에 PID를 저장하여 필요할 경우 kill PID또는 kill -9 PID강제로 강제 종료해야하는 경우 프로세스 를 강제 종료 할 수 있습니다. 또는 나중에 ps -ef | grep "command name"PID를 찾아 PID를 찾을 수 있습니다. 참고 nohup키워드 / 명령 자체가 표시되지 않는 ps문제의 명령의 출력.

스크립트를 사용한 경우 다음과 같은 작업을 수행 할 수 있습니다.

nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt

이것은 실행 my_command에 모든 출력 저장 my.log(스크립트의를 $!마지막 프로세스의 PID 실행 나타낸다). 는 2표준 오류에 대한 파일 기술자 (인 stderr) 및 2>&1표준 출력 (파일 기술자로 라우팅 표준 오류 출력에 쉘을 알려줍니다 1). &1쉘이 파일 이름이 아닌 해당 컨텍스트에서 파일 디스크립터임을 알 수 있도록 요구합니다 1. 는 2>&1일반적으로 우리에 표준 오류에 기록되는 오류 메시지를 캡처하기 위해 필요 my.log(표준 출력에서 오는) 파일을. 셸을 사용한 I / O 리디렉션 처리에 대한 자세한 내용 은 I / O 리디렉션 을 참조하십시오.

명령이 정기적으로 출력을 보내면을 사용하여 가끔 출력을 확인 tail my.log하거나 "실시간"을 따라 가려면을 사용할 수 있습니다 tail -f my.log. 마지막으로 프로세스를 종료해야하는 경우 다음을 통해 수행 할 수 있습니다.

kill -9 `cat save_pid.txt`
rm save_pid.txt

15
약간의 설명이, 그렇지 않은 nohup이 마지막이다, 그 자체가 인쇄합니다 PID &예를 들어, 어떤 배경을 ls &실행하기위한 PID를 보여줄 것ls
karmakaze

1
'2> & 1'은 무엇을합니까?
Viraj

4
@Viraj 2는 "표준 오류"파일 설명자입니다. >쉘 리디렉션이고 &1"표준 출력"파일 디스크립터입니다 ( &여기서 쉘은 내가라는 파일을 참조한다고 생각하지 않습니다 1). 따라서 2 > &1표준 오류 출력을 표준 입력으로 리디렉션합니다. 이전의 > my.log방법은 표준 출력을로 리디렉션하는 수단 이므로 my.log오류 메시지도 전달할 수있는 방법이 필요합니다 my.log. 2 > &1이러한 오류가 표준 출력으로 이동하고이 결과가로 이동합니다 my.log. I / O 리디렉션을 참조하십시오 .
lurker

6
echo $!나에게 대신 프로세스의 nohup을의 PID를 양산 제공 : paste.fedoraproject.org/428697/99695314
Nehal J 와니

1
@Mvorisek &는 명령 구분 기호 역할을하므로 시도 할 수 sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt"있습니다. 작동하지만 시도하지 않았습니다.
lurker

91

VPS 서버 (및 SSH-putty를 통해)에서 Red Hat Linux를 사용하고 있습니다.

먼저 실행중인 모든 프로세스를 나열합니다.

ps -ef

그런 다음 첫 번째 열에 사용자 이름이 있습니다. 나는 그것을 다음 세 번 발견했다.

  • 하나는 SSH 연결이었습니다
  • 두 번째는 FTP 연결이었습니다
  • 마지막은 nohup 프로세스였습니다

그런 다음 두 번째 열에서 nohup 프로세스의 PID를 찾을 수 있으며 다음을 입력하십시오.

kill PID 

(물론 nohup 프로세스의 PID로 PID를 대체합니다)

그리고 그게 다야!

이 답변이 bash 및 SSH를 처음 접하는 사람에게 유용하지만 여기에서 필요한 지식의 95 %를 찾았습니다. :)


3
UID 대신 PID를 의미한다고 생각합니까?
wprins

@wprins에 동의합니다. UID를 죽이는 것은 효과가 없었지만 PID를 죽이는 것은 효과가 없었습니다.
Ryan

필자의 경우 nohup과 함께 테스트 쉘 스크립트 (long_running_script.sh)를 실행했으며 & 및 dint가 중지하는 방법을 알고 있습니다. 마지막으로 ps -ef | grep long_running * 및 PID를 손상시킵니다. 그런 다음 PID를 죽이십시오
20:56에 Joseph Joseph

50

아래 명령으로 백그라운드에서 루비 스크립트를 실행한다고 가정하십시오.

nohup ruby script.rb &

그런 다음 명령 이름을 지정하여 위의 백그라운드 프로세스의 pid를 얻을 수 있습니다. 제 경우에는 명령이 루비입니다.

ps -ef | grep ruby

산출

ubuntu   25938 25742  0 05:16 pts/0    00:00:00 ruby test.rb

kill 명령을 사용하여 프로세스를 쉽게 종료 할 수 있습니다.

kill 25938

1
Sanjay, 그냥 빠진 것이 없다고 확신합니다. 귀하의 답변 중 어떤 부분이 몇 년 전에 제공된 답변과 새롭거나 다른 것입니까? ps -ef그리고 kill둘 다 위에서 잘 다루어졌습니다. 그래서 새로운 부분은 무엇입니까?
David C. Rankin

2
ps -ef는 긴 출력 목록을 제공하므로이 긴 목록에서 검색하기가 어렵습니다. 그래서 나는 ps -ef | grep ruby는 ps -ef를 수행하는 것보다 pid를 검색하는 것이 좋습니다.
산 제이 Salunkhe

20

jobs -l 은 nohup 프로세스 목록에 대한 pid를 제공해야합니다. 그들을 부드럽게 (-9) 죽이십시오. ;)


11
현재 쉘에서 작업이 시작된 경우에만. 그리고 kill -9규칙적인 신호가 작동하지 않는다는 것을 알지 않는 한하지 마십시오.
tripleee

1
ps가 설치되지 않은 도커 이미지에있는 경우 유용합니다. :-)
Andreas Profous

5

당신은 시도 할 수 있습니다

kill -9 `pgrep [command name]`

2
아주 좋아요! 내가 사용 pkill [command name]당신이 사용할 수있는 -o가장 오래된 일치하는 프로세스를 죽이는 플래그를, 또는 -n대신 새로운 하나를 사용하십시오.
zanona

4

이것은 작동합니다 Ubuntu

이것을 입력하여 PID

ps aux | grep java

자바에 관한 모든 실행중인 프로세스가 표시됩니다

내 경우에는

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar

자 죽여 kill -9 3315

좀비 프로세스가 마침내 중단되었습니다.


4

nohup으로 Java 프로그램을 실행한다고 가정하면 Java 프로세스 ID를 얻을 수 있습니다.

`ps aux | grep java`

산출

xxxxx     9643  0.0  0.0  14232   968 pts/2   

다음을 입력하여 프로세스를 종료 할 수 있습니다

sudo kill 9643

또는 모든 Java 프로세스를 종료해야한다고 말하면됩니다.

sudo killall java

이 명령은 모든 Java 프로세서를 종료합니다. 프로세스와 함께 사용할 수 있습니다. 명령 끝에 프로세스 이름을 지정하십시오.

sudo killall {processName}

2

nohup에서 작업을 만들면 프로세스 ID를 알려줍니다!

nohup sh test.sh &

출력은 다음과 같은 프로세스 ID를 보여줍니다.

25013

당신은 그것을 죽일 수 있습니다 :

kill 25013

1

다음 명령으로 django 서버를 시작했습니다.

nohup manage.py runserver <localhost:port>

이것은 CentOS에서 작동합니다.

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

이것이 process not foundnohup과 의 혼란 을 해결하기위한 것 입니다.
CodeSpent

0

오늘 나는 같은 문제를 만났다. 그리고 오래 전부터 어떤 명령을 언제 사용했는지 완전히 잊었습니다. 세 가지 방법을 시도했습니다.

  1. ps -ef명령에 표시된 STIME 사용 이것은 프로세스를 시작한 시간을 보여 주며 ssh를 닫기 직전에 명령을 내릴 가능성이 큽니다. 불행히도 최신 명령이 nohup을 사용하여 실행하는 명령이라고 생각하지 않으므로 이것이 작동하지 않습니다.
  2. 두 번째는 PPID이며 ps -ef명령 에도 표시됩니다 . 프로세스를 작성하는 프로세스의 ID 인 상위 프로세스 ID를 의미합니다. nohup을 사용하여 실행하는 프로세스의 우분투에서 ppid는 1입니다. 그런 다음 사용할 수 있습니다ps --ppid "1" 목록을 가져 와서 TIME (프로세스 사용 총 CPU 시간) 또는 CMD를 확인하여 프로세스의 PID를 찾을 수 있습니다.
  3. lsof -i:port프로세스가 일부 포트를 사용하는 경우 사용 하면 명령이 표시됩니다. 그런 다음 위의 답변과 같이 사용 ps -ef | grep command하면 PID를 얻을 수 있습니다.

프로세스의 PID를 찾으면 프로세스를 종료하는 kill pid데 사용할 수 있습니다 .

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