lsof -i를 통해 찾은 pid를 -9 죽이는 스크립트를 작성하는 방법


29

나는 바람둥이를 사용하고 있으며 때로는 중지하라는 메시지를 표시해도 프로세스가 제대로 종료되지 않습니다.

이것에 대한 나의 길은 너무합니다 :

lsof -i tcp:8080

어떤 출력 :

COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    888 root   35u  IPv6 780659      0t0  TCP *:http-alt (LISTEN)
java    888 root   39r  IPv6 790103      0t0  TCP localhost:58916->localhost:http-alt (CLOSE_WAIT)
java    888 root   40r  IPv6 792585      0t0  TCP localhost:58936->localhost:http-alt (CLOSE_WAIT)
java    888 root   75r  IPv6 785553      0t0  TCP localhost:58701->localhost:http-alt (CLOSE_WAIT)
java    888 root   77r  IPv6 787642      0t0  TCP localhost:58814->localhost:http-alt (CLOSE_WAIT)
java    888 root  130u  IPv6 783894      0t0  TCP localhost:58686->localhost:http-alt (CLOSE_WAIT)
java    888 root  353u  IPv6 780929      0t0  TCP localhost:58632->localhost:http-alt (CLOSE_WAIT)

그런 다음 실행

kill -9 pid

모든 pid 번호를 가져 와서 죽일 수있는 방법을 원합니다. 그 분야를 분리하는 방법을 모르겠습니다.


1
tomcat프로세스 가 하나만 열려 있다고 확신하면 다음을 사용할 수 있습니다.killall -9 tomcat
Joseph R.

답변:


57

-t(terse) 옵션이 있습니다 lsof. 즉, 원하는 것을 정확하게 수행하는 것 같습니다.

$ sudo lsof -ti tcp:80
1387
4538
4539

만나다 man lsof

-t       specifies  that  lsof should produce terse output with process
         identifiers only and no header - e.g., so that the output  may
         be piped to kill(1).  -t selects the -w option.

필요한 권한이 있다고 가정하면 kill명령 대체 를 사용하여 결과를 PID 목록으로 전달할 수 있습니다 .

kill -9 $(lsof -ti tcp:80)

이제 내가 ;-) BTW 요청했습니다 질문에 모두 대답 한
user2757729

3

kill--no-run-if-empty 옵션을 잊지 마십시오 :)

lsof -ti :8080 | xargs --no-run-if-empty kill -9

그렇게하면 kill 은 프로세스 수신 대기에서만 실행되며 직접 확인하지 않아도됩니다.


'
--run

1

lsof -i tcp:8080출력을 생성 한 다음 | egrep -v "COMMAND PID USER"헤더 행 을 삭제 한 다음 | awk '{print $2}'두 번째 필드 를 인쇄하고에 | sort -n대한 숫자를 준비하여 | uniq각 고유 PID를 한 번만 출력합니다. 모든 것을 종합하면 다음과 같은 이점이 있습니다.

 lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq  

그러나 pkill -KILL tomcat또는 killall -KILL tomcat더 쉽습니다.


Tomcat 프로세스는 이름이 "tomcat"이 아니므로 문제가됩니다. 일반적인 Java 프로세스 일뿐 아니라 동시에 실행중인 다른 Java 프로세스가있는 경우 올바른 프로세스를 식별하기 위해 추가 작업을 수행해야합니다.
Terry Wang

@TerryWang Yup, 그게 내가 가진 문제입니다. Steeldrivers의 답변이 훌륭합니다.
user2757729

0

@waltinator의 라이너 하나가 훌륭합니다.

나는 그것에 더 많은 맛을 더할 것입니다 :

lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq | xargs kill -9

또는

kill -9 $(lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq)

참고 : 이것은 여전히 ​​매우 기본적이므로 실제 환경에서 더 견고하게 만들기 위해 소금과 후추를 더 추가해야 할 수도 있습니다.


0

이것은 약간의 오류 검사를 생각 해낸 스크립트입니다.

#!/bin/bash

PORT=$1

if ! [[ "$PORT" =~ ^[0-9]+$ ]] ;
then
  printf "error: '$PORT' is not a number.\n\nUsage killport <port number>\n"
  exit 1
fi

PID=$(lsof -ti:$PORT)

if ! [[ "$PID" =~ ^[0-9]+$ ]] ;
then
  printf "no proccess found, nothing to kill.\n"
  exit 0
fi

printf "killing process $PID running on $PORT\n"
kill -9 $PID

0

간단한 생선 껍질 기능은 다음과 같습니다.

function kill-port
  set pids (lsof -ti tcp:$argv)
  if test $pids
    kill -9 $pids
  else
    echo "No proccesses on that port to kill to see for your self -- lsof -i tcp:$argv"
  end
end

이 빨판을이 위치의 파일에 붙이면 ~/.config/fish/functions/kill-port.fish좋을 것입니다. 당신은 그것을처럼 호출 할 수 있습니다kill-port 8000

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