PID 대신 이름으로 프로세스를 종료하려면 어떻게해야합니까?


349

때때로 Firefox를 시작하려고하면 "Firefox 프로세스가 이미 실행 중입니다"라고 표시됩니다. 그래서 나는 이것을해야합니다 :

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

내가 원하는 것은 나를 위해 모든 것을 할 명령입니다. 입력 문자열과 grep프로세스 목록에서 (또는 무엇이든) 가져 와서 출력의 모든 프로세스를 종료합니다.

jeremy@jeremy-desktop:~$ killbyname firefox

PHP에서 시도했지만 PHP 스크립트 자체에서 exec('ps aux')실행 된 프로세스 만 표시하는 것 같습니다 exec()(따라서 표시되는 유일한 프로세스는 자체입니다).


Firefox가 이미 실행 중이라는 메시지가 표시되면 보통 1 초 정도 기다려야 Firefox를 다시 실행할 수 있습니다 (물론 항상 그런 것은 아닙니다).
nuoritoveri

1
JohnB가이 답변에서 말하는 가장 안전한 방법입니다. stackoverflow.com/questions/6381229/…
tecnoshopbq


이것은 오래된 질문이지만 허용되는 답변을 변경할 수 있습니까? 표시 한 프로세스는 JVM에서 실행하는 프로세스와 같은 많은 프로세스에서 실패합니다.
루이스 드 수사

위의 설명에서 Luis는이 주제를 참조하는 모든 사람에게 아래 pkill -f "Process name"명령에 대한 답변을 참조하고 있습니다 .
Digger

답변:


505
pkill firefox

자세한 정보 : http://linux.about.com/library/cmd/blcmdl1_pkill.htm


7
죽이기 프로세스를 진행하기 전에 pgrep을 사용하여 죽이는 것을 파악하는 것이 좋습니다. 특히을 사용할 때 -f.
Akrikos

pkill은 매우 친절하지 않습니다. killall과 동일한 방식으로 이름을 지정할 수 없습니다.
Octopus

2
pkill -U <username>아주 편리합니다. 나는이 솔라리스 A와 웹 서버, 실제 웹 서버 데몬을 설치는 서비스 그것으로 자신의 사용자입니다. 따라서 사용자가 지정하는 것은 재시작을 트리거하는 간단하고 쉬운 방법입니다.
Raystorm 2019

6
강제 종료 : pkill -9 firefox
Justas

이것은 최대 절반의 시간 동안 작동합니다. -f옴니버스 솔루션 에는 최소한 플래그 가 필요 합니다.
루이스 드 수사

112

사용 가능 :

pkill -f "Process name"

나를 위해, 그것은 완벽하게 일했습니다. 내가 찾던 것입니다. pkill은 플래그 없이는 이름으로 작동하지 않습니다.

되면 -f설정된 전체 명령 라인 패턴 매칭에 사용된다.


2
특별히 뭔가 실행하는 와인을-f 옵션이 정말 필요합니다. 예pkill -f "EvilWindowsServer.exe"
CodeBrauer

이것은 정답입니다. 첫 번째 대답은 JVM에서 실행되는 것과 같은 많은 종류의 프로그램에서 실패합니다.
루이스 드 수사

1
-f파이썬 스크립트를 실행하는 백그라운드 프로세스를 죽이기 위해 플래그 를 추가해야했습니다 .
메이슨

제 경우에는 2 개의 깃발이 필요했습니다 :pkill -f -9 PROCESSNAME
Slavik

64

당신은 이름 으로 프로세스를 죽일 수 있습니다killall <name>

killall 은 지정된 명령을 실행하는 모든 프로세스에 신호를 보냅니다. 신호 이름을 지정하지 않으면 SIGTERM이 전송됩니다.

신호는 이름 (예 : -HUP 또는 -SIGHUP ) 또는 번호 (예 : -1 ) 또는 옵션 -s 로 지정할 수 있습니다 .

명령 이름이 정규식이 아니고 (옵션 -r ) 슬래시 (/)를 포함하는 경우 해당 파일을 실행하는 프로세스는 이름과 상관없이 종료를 위해 선택됩니다.

그러나 프로세스가 표시되지 않으면 프로세스 ps aux를 죽일 권리가 없을 것입니다 ...


6
응답하지 않는 프로그램을 강제 종료하려면 TERM 대신 KILL을 보내십시오.killall -s KILL firefox
Martin Hansen

45

조금 더 긴 대안 :

kill `pidof firefox`

25
pidof 파이어 폭스 | xargs kill -9
hbt 16:16에

1
이것은 내장 장치에 대해 busybox에서 작동합니다 :)
nwgat

25

가장 쉬운 방법은 먼저 올바른 프로세스 ID를 얻는 지 확인하는 것입니다.

pgrep -f [part_of_a_command]

결과가 예상 한 경우 함께 가다 :

pkill -f [part_of_a_command]

19

이상하지만 다음과 같은 해결책을 보지 못했습니다.

kill -9 `pidof firefox`

또한 다음과 같은 여러 프로세스 (여러 pid)를 죽일 수 있습니다.

kill -9 `pgrep firefox`

pidof단일 라인 출력이 있기 때문에 선호 합니다.

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

이것을 실행할 때 오류가 발생했습니다 kill: invalid number 'pidof myprogram'. 여기서 나쁜 점은 무엇입니까?
Brethlosze

오늘 방금 내 목숨을 구했습니다 고마워요
MilMike

1
@Brethlosze 명령에 백틱이 필요한 반면 @Brethlosze를 사용하면 한 번만 진드기를 넣을 수 있습니다.
스펙트럼

고마워요! .. 나는이 백틱을 알고있을 것입니다 :)
Brethlosze

13

snippet시작 경로에있는 모든 프로세스를 종료하십시오 . / directory /를 스 니펫으로 지정하여 일부 디렉토리에서 시작한 모든 앱을 종료 할 수 있습니다. 이것은 동일한 응용 프로그램 디렉토리에서 동일한 응용 프로그램에 대한 여러 구성 요소를 시작할 때 매우 유용합니다.

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

* 가능한 경우 pgrep를 선호합니다


1
이것은 흔히 볼 수있는 반 패턴의 조합입니다. 자신과 일치하지 않는 정규 표현식을 사용하거나 쓸모없는grep 스크립트를 피하십시오 . ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
tripleee

1
쓸모없는 grep을 피하면서 <snippet>을 매개 변수화하는 자동화 된 프로세스에서 명령을 사용하는 오타와 능력을 피할 수는 없습니다.
Mike

이것은 실제로 그것을하는 가장 좋은 방법입니다!
Abhinandan Dubey

왜 @tripleee의 [s]작업이 awk 프로세스 자체와 일치하지 않는지 이해 하는 것이 좋을까요?
andig

정규식 [x]y은 문자열과 일치 xy하지만 그 반대 는 일치 하지 않기 때문입니다. 이것은 일반적인 FAQ입니다. 이 링크는 20 년 전의 페이지로 연결되어 있으며 이에 대한 자세한 설명이 있습니다. 그리고 이것은 이미 반복되는 질문이었습니다.
tripleee

11

Mac에서는 pgrep을 찾을 수 없었고 pkill도 작동하지 않았으므로 간단한 하나의 라이너 스크립트를 작성했습니다.

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

이 작업을 수행하는 더 쉬운 방법이 있다면 공유하십시오.


1
롤 이것은 그러한 작업에 미친 명령입니다. 신경 쓰지 마. 그 간단한 한 줄이라고 했습니까? : D Simple is killall
m3nda

@ erm3nda :-) 동의합니다. 되돌아 보면 정신 나간 것 같습니다. killall이 내 Mac에서 작동하지 않는 이유를 기억할 수 없습니다.
Dhiraj

이것은 "jboss"와 같은 특정 Java 프로세스를 종료하려고 할 때 매우 유용합니다. 이 경우 killall은 도움이되지 않습니다.
Jan M


6

grep으로 죽이려면 :

kill -9 `pgrep myprocess`

5

더 정확한 것은 다음과 같습니다.

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid

1
왜 당신이 할 export경우에만 동일한 프로세스에서 한 번 사용하려는 변수?
tripleee


3

나는 나 자신에게 같은 질문을했지만 현재 답변의 문제점은 그들이 죽일 프로세스를 안전하게 확인 하지 못한다는 것입니다 ... 끔찍한 실수로 이어질 수 있습니다 :) ... 특히 여러 프로세스가 패턴과 일치하는 경우 .

면책 조항으로, 나는 sh 전문가가 아니며 확실히 개선의 여지가 있습니다.

그래서 나는 작은 sh 스크립트를 썼습니다 :

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi

2

그놈을 실행하면 시스템 모니터 (시스템-> 관리-> 시스템 모니터)를 사용하여 Windows에서와 같이 프로세스를 종료 할 수 있습니다. KDE는 비슷한 것을 가질 것입니다.


2

기본 kill명령은 PID의 대안으로 명령 이름을 승인합니다. kill (1)을 참조하십시오 . 자주 발생하는 문제는 명령 이름이 아닌 작업 번호를 받아들이 bash는 자체 문제입니다 . 이것은 기본 명령을 방해합니다. 전자의 기능이 후자의 기능보다 유용하면 다음 을 호출 하여 버전을 비활성화 할 수 있습니다killkill %1bash

enable -n kill

추가 정보 참조 killenable항목 bash는 (1) .


내가 한 행동을 어떻게 다시 가능하게 enable -n kill합니까?
Brethlosze

1
@hyprfrcbenable kill
Vee



0

awk oneliner는 ps출력 헤더를 구문 분석 하므로 열 번호 (그러나 열 이름)는 신경 쓰지 않아도됩니다. 정규식을 지원하십시오. 예를 들어, 경로가없는 실행 파일 이름에 "firefox"라는 단어가 포함 된 모든 프로세스를 종료하려면

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.