프로세스가 실행 중일 때만 죽이는 방법?


14

현재 sh 스크립트 파일에서 다음과 같은 줄을 사용합니다.

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

그러나 프로세스 ( myServerhere)가 실행중인 경우에만 호출하는 방법이 궁금합니다 .


kill테스트와 호출 사이에 경쟁 조건이 있기 때문에 프로세스가 실행 중일 때만 호출 할 수 없습니다 kill(짧은 시간에 다른 이유로 프로세스가 중지되었을 수 있음). 당신은 사용해야 pkill하거나 killall정확하게 수행하려고 것과 동일한 작업을 수행하는 미만으로 입력 (그리고 아마도 몇 가지 다른 장점도).
JanC

답변:


20

나는 보통 pgrep과 pkill을 사용합니다.

if pgrep myServer; then pkill myServer; fi

7
pkill myServerkillall -q myServer? 존재하지 않는 프로세스를 종료하려는 시도에는 단점이 없습니다.
David Foerster

12
종료 할 프로세스가 없으면 0을 종료하지 않으므로 스크립트가 중단 될 수 있습니다.
boutch55555

6
|| true그런 다음 추가하십시오 .
David Foerster

사실, 프로세스가 이미 종료되었음을 알리기 위해 다른 것을 추가 할 수있는 유연성은 없습니다.
boutch55555

무엇에 대해 if ! killall -q myServer; then echo ERROR; fi?
David Foerster

9

당신이 사용하는 이름으로 프로세스를 죽일 수 pkill또는 killall, 그 사람이 페이지를 확인하십시오.


예, 달리 kill프로세스가 실행중인 경우에만 종료됩니다. 예를 들어pkill -u myuser -f myprocess\.[0-9]+
Chase T.

6

약간 다른 접근 방식은 다음과 같습니다.

killall PROCESS || echo "Process was not running."

프로세스가 존재하지 않으면 명령 1에서 리턴 된 오류 코드를 피할 수 killall있습니다. echo부분은 경우에만, 행동으로 올 것이다 killall반환 1자체가 반환됩니다 반면, 0(성공).


5
사용하는 killall -q것이 좋습니다
Anwar

1
경고, killall -q모든 유닉스 버전에서 지원되는 것은 아니며 macOS Catalina는 아직 지원하지 않습니다.
tresf

0

사용해보십시오 :

sudo kill `pidof process_name`

여기서 process_name은 종료하려는 프로세스의 이름입니다. 이것에 대한 좋은 점은 pidof가 주어진 이름과 일치하는 모든 프로세스의 pid를 나열한다는 것입니다. kill은 여러 pid를 허용하므로 단일 변덕으로 모든 pid를 죽입니다.

이것이 도움이되는지 알려주십시오.


목록이 비어 있으면 어떻게합니까? (내 요점은 모든 가능한 경우에 호출 죽일 아니었다)
myWallJSON

1
목록이 비어 있으면 kill은 오류 코드 1을 반환하고 아무것도 죽이지 않습니다. 인수없이 kill을 호출하는 것과 같습니다. pidof가 빈 목록을 반환하는지 먼저 확인하는 if 문을 추가 할 수 있습니다. 빈 목록을 반환하지 않으면을 호출하십시오 kill `pidof process_name. 빈 목록을 반환하면 kill 호출을 건너 뜁니다.
amandion

0

R & D로 만든 작은 스크립트. 나는 당신이 그것을 좋아 바랍니다

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

script.sh와 같은 이름으로 저장 한 다음

chmod +x script.sh
./script.sh

그런 다음 프로세스 이름을 지정하십시오.

참고 : 나는 이것과 그것으로 잘 여러 번 시도했다.


이 스크립트에 어떤 문제가 있는지 알고 싶습니다. -ve 투표에는 설명이 필요합니다.
rɑːdʒɑ

이 스크립트에 아무 문제가 없습니다 ... +1
WinEunuuchs2Unix 1

0

로 프로세스가 존재하는지 확인하십시오 pidof. 그렇다면 죽이십시오.

(! pidof process_name) || sudo kill -9 $(pidof process_name)

위의 명령을 실행 한 후 종료 코드는 항상 0입니다.


0

pkill옵션과 함께 사용-f

pkill -f myServer

옵션 -f은 일반적으로 프로세스 이름과 일치하는 패턴입니다.


-1

나는 사용할 것이다 :

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

xargs -r입력이있는 경우에만 살인을 실행 알려줍니다. 이 ps --no-header -eo pid,cmd구문 분석을 위해 출력을 더 나은 형식으로 가져옵니다.

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