"kill -9"가 브라우저와 서버를 종료하는 이유는 무엇입니까?

"kill -9"가 브라우저와 서버를 종료하는 이유는 무엇입니까?

kill -9때로는 Rails 서버를 종료하기 위해 최후의 수단으로 사용해야 할 때도 있습니다 . 안타깝게도 이 작업을 너무 자주 수행해야 하므로 이를 수행하기 위해 bash_profile에 도우미 함수를 작성했습니다.

이 작업을 수동으로 수행하면 ps aux | grep '[r]ails]pid(예 12345: ) 를 가져오고 kill -9 12345서버가 종료되고 브라우저는 그대로 유지됩니다. 하지만 내 기능은 또한 브라우저를 종료시키고 싶지 않습니다.

function running {
  ps -p $(lsof -i :3000 -t) &> /dev/null
}

function k9 {
  if running
  then
    kill -9 $(lsof -i :3000 -t)
  else
    echo "Rails server is not running"
  fi
}

lsof -i :3000 -t얻은 pid가 내가 얻은 pid와 동일한 것을 확인했는데 ps aux, 내가 뭘 잘못하고 있는 걸까요?

답변1

질문:

를 사용하면 lsof -i :3000 -t포트 3000에 연결된 모든 프로세스를 찾을 수 있습니다.외딴옆.

스크립트를 사용하는 경우 브라우저는 포트 3000에서 Rails 서버에 연결되는 것으로 나타납니다. 차이점은 브라우저를 사용하는 것과 kill.

이는 브라우저가 too 출력에 나열되고 lsof종료됨을 의미합니다.

로컬이나 다른 곳에서 포트 3000을 사용하는 프로세스보다는 Rails 서버와 유사한 프로세스를 종료하는 것이 더 나을 것입니다.


일반 솔루션:

pkill~이다올바른 도구작업.
~을 위한노력하다일치시킬 대상, 사용 pgrep, 일치 방법은 동일합니다.

서버의 명령줄(ps에 표시된 대로)이 다음으로 시작하는 경우명령 이름서버 인스턴스를 식별하려면 다음 을 사용할 수 있습니다 pkill servercommand.
명령줄매개변수는 를 추가합니다 . -f예: .pkill -f serverargument

종료된 프로세스 pkill만 나열되므로 pgrep이를 사용하여 종료될 프로세스를 시도해 보세요. pid뿐만 아니라 명령줄을 나열하는 -a옵션 을 추가합니다 .pgrep


pgrep / pkill의 예:

사용 예 -f: 에 따르면 ps다음 두 인스턴스가 xbindkeys실행 중입니다.

$ ps aux|grep '[x]bindkeys'
26719 ?        S      0:00 xbindkeys -f /tmp/xbindkeysrc-tmp
32046 ?        S      0:00 xbindkeys -f /home/auser/.xbindkeysrc

이제 다음을 통해 두 인스턴스를 모두 찾을 수 있습니다.

$ pgrep xbindkeys
26719
32046

또는 다음 명령을 표시하세요.

$ pgrep -a xbindkeys
26719 xbindkeys -f /tmp/xbindkeysrc-tmp
32046 xbindkeys -f /home/auser/.xbindkeysrc

또는 명령줄 인수를 통해 인스턴스 중 하나를 일치시킵니다.

$ pgrep -f '/home/auser/.xbindkeysrc'
32046

그렇지 않은 경우 -f일치하는 프로세스가 없습니다.

$ pgrep '/home/auser/.xbindkeysrc'

마지막으로 프로세스에 신호를 보냅니다 kill. 예를 들면 다음과 같습니다.

$ pkill -f '/home/auser/.xbindkeysrc'


독창적인 접근 방식을 기반으로 한 대체 솔루션:

해결책은 pkill더 일반적이지만 원래 접근 방식을 따르려면 lsof다음 명령을 사용할 수 있습니다.더 엄격한 "어떤 방식으로든 로컬 포트를 사용하는 모든 프로그램 또는 어떤 방식으로든 원격 포트를 사용하는 모든 프로그램"이 아니라
"해당 포트를 수신하는 모든 로컬 서버" 와 일치합니다 .

이 옵션은 -sTCP:LISTEN목록을 수신 포트로 제한하며 로컬 포트만 수신할 수 있으므로 로컬 포트만 수신할 수 있습니다.

if다음과 같은 테스트 로 사용할 수 있습니다 .

if lsof -i :3000 -sTCP:LISTEN -t >/dev/null ; then
    echo running
else
    echo not running
fi



Kill -9에 표시된 대로 SIGKILL 사용에 대한 참고 사항:

KILL 신호는 다음 과 pkill같은 방식으로 사용됩니다 kill.

$ pkill -9 -f '/home/auser/.xbindkeysrc'

그러나 대부분의 경우 이는 기본 신호에 비해 이점을 제공하지 않으며 -15어떤 경우에는 문제가 발생합니다. 그러니 습관으로 삼는 것은 좋지 않습니다.

보세요언제 -9 프로세스를 종료하면 안 됩니까?-9기본값을 사용하고 싶지 않은 이유를 이해하십시오 .

관련 정보