때로는 프로세스를 종료해야 할 때도 있습니다(이유는 그다지 중요하지 않습니다). 나는 다음을 사용하여 프로세스를 찾을 수 있다는 것을 알고 있습니다. 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)}'
그러나 나는 올바른 프로세스를 종료하는 것이 항상 마지막 프로세스라는 귀하의 진술에 문제가 있습니다. lsof
PID를 늘려 프로세스를 표시하는 것은 의미가 없습니다. 프로세스 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 부분만 유지) 인쇄합니다.