이전 명령에서 제공한 특정 PID를 종료하는 명령

이전 명령에서 제공한 특정 PID를 종료하는 명령

때로는 프로세스를 종료해야 할 때도 있습니다(이유는 그다지 중요하지 않습니다). 나는 다음을 사용하여 프로세스를 찾을 수 있다는 것을 알고 있습니다. lsof -i :8080내 후보자가 되십시오.마지막 단계출력 테이블에서.

예를 들어 이 명령을 실행하면 다음 출력이 나타납니다.

COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    15112 dani   70u  IPv4 3178183      0t0  TCP localhost:39998->localhost:http-alt (CLOSE_WAIT)
java    15112 dani  137u  IPv4 3181607      0t0  TCP localhost:39999->localhost:http-alt (CLOSE_WAIT)
java    15112 dani  138u  IPv4 3181608      0t0  TCP localhost:40000->localhost:http-alt (CLOSE_WAIT)
java    15112 dani  139u  IPv4 3181609      0t0  TCP localhost:40001->localhost:http-alt (CLOSE_WAIT)
java    15112 dani  140u  IPv4 3181610      0t0  TCP localhost:40002->localhost:http-alt (CLOSE_WAIT)
java    19509 dani   50u  IPv6 4617361      0t0  TCP *:http-alt (LISTEN)
java    19509 dani   52u  IPv6 6642445      0t0  TCP localhost:http-alt->localhost:42996 (CLOSE_WAIT)

그래서 내 목표는PID 19509. 파이프를 사용하여 마지막 행의 PID를 어떻게 선택합니까?

나는 이런 명령을 얻고 싶다lsof -i :8080 | something here to get the PID | kill -9

저는 Linux Mint KDE x64를 실행하고 있습니다.

답변1

귀하의 질문에 말 그대로 대답하면 마지막으로 표시된 PID를 나열하는 한 가지 방법이 있습니다 lsof.

lsof … | awk 'END {print $2}'

입력을 읽고 한 줄씩 처리하는 텍스트 처리 언어입니다. 코드에서는 END {…}전체 입력이 처리된 후 중괄호 안의 코드가 실행되고 마지막 줄에서 유효한 연산이 수행됩니다. $2줄에서 공백으로 구분된 두 번째 필드입니다.

이를 종료하는 몇 가지 방법은 다음과 같습니다(각 줄은 독립적으로 작동합니다).

kill $(lsof … | awk 'END {print $2}')
lsof … | awk 'END {print $2}' | xargs kill
lsof … | awk 'END {system("kill " $2)}'

그러나 나는 올바른 프로세스를 종료하는 것이 항상 마지막 프로세스라는 귀하의 진술에 문제가 있습니다. lsofPID를 늘려 프로세스를 표시하는 것은 의미가 없습니다. 프로세스 ID가 순차적으로 할당되는 시스템(모든 Unix 변형도 아니고 모든 Linux 설치도 아님)에서도 최대값(보통 32767)에 도달하면 래핑됩니다. 그러므로 PID를 비교하여 프로세스를 결정하는 것은 의미가 없습니다.

어떤 프로세스를 종료할지 결정하려면 몇 가지 추가 정보가 필요합니다. 원하는 정보 유형과 출력에 "이상한" 문자(예: 파일 이름이나 프로그램 이름의 공백)가 포함되어 있는지 여부에 따라 awk와 같은 도구를 사용하여 출력을 처리 하거나 다음에서 생성된 출력을 lsof사용할 수 있습니다. 이 -F옵션은 lsof간단한 경우 구문 분석하기가 조금 더 어렵지만 (거의) 모호성이 덜하고 강력하게 구문 분석하기가 더 쉽습니다. 예를 들어 포트 8080에서 수신 대기 중인 프로세스를 종료하려면 다음을 수행합니다.

lsof -n -i :8080 -F | awk '
    sub(/^p/,"") {pid = $0}
    $0 == "n*:http-alt" {print pid}
' | xargs kill

이 함수를 호출하면 sub줄의 시작 부분이 빈 문자열로 대체됩니다. p이 대체가 수행되면 {pid = $0}코드 블록이 실행되고 pid표시된 마지막 PID 값이 포함됩니다 lsof. pid두 번째 awk 줄은 해당 줄이 발생하는 경우 변수 값을 인쇄합니다. "n*:http-alt"이는 lsof가 모든 인터페이스의 포트 8080에서 수신 대기하는 소켓을 보고하는 방법입니다.

이 특정 표준은 실제로 어떤 구문 분석도 필요하지 않습니다(위에서는 예시로만 보여드렸습니다). lsof지정된 포트에서 수신 대기하는 프로세스만 표시 하도록 할 수 있습니다 .

lsof -n -a -iTCP:8080 -sTCP:LISTEN -Fp | sed 's/^p//' | xargs kill

또는 이를 위해 다음을 사용할 수 있습니다.netstat대신에.

netstat -lnpt | awk '$4 ~ /:8080$/ {sub(/\/.*/, "", $7); print $7}'

awk 코드 설명: 열 4가 로 끝나면 :8080열 7의 첫 번째 열 뒤의 모든 내용을 바꾸고 /(프로세스 이름 부분을 제거하고 PID 부분만 유지) 인쇄합니다.

관련 정보