포트 3000에서 실행되는 프로세스에 대한 추가 정보없이 PID 만 얻는 방법은 무엇입니까?


18

CentOS 7을 사용하고 있습니다. 포트 3000에서 실행중인 프로세스의 PID (있는 경우)를 가져오고 싶습니다. 쉘 스크립트의 변수에 저장하기 위해이 PID를 가져오고 싶습니다. 지금까지

[rails@server proddir]$ sudo ss -lptn 'sport = :3000'
State      Recv-Q Send-Q                           Local Address:Port                                          Peer Address:Port
Cannot open netlink socket: Protocol not supported
LISTEN     0      0                                            *:3000                                                     *:*                   users:(("ruby",pid=4861,fd=7),("ruby",pid=4857,fd=7),("ruby",pid=4855,fd=7),("ruby",pid=4851,fd=7),("ruby",pid=4843,fd=7))

그러나이 모든 추가 정보없이 PID를 자체적으로 분리하는 방법을 알 수는 없습니다.


sudo ss -lptnH "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'. 설명이 필요하십니까?
user996142

2
설명이 필요 없지만 "ss : invalid option- 'H'"오류가 발생합니다.
Dave

ss이 옵션이없는 오래된 것일 수도 있습니다 . 그것 없이도 작동해야합니다.sudo ss -lptn "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
user996142

2
@ user996142 매우 유용한 의견이 아닙니다. 하지만 좋은 대답이 될 수 있습니다
AAAAA는 분석 재개 모니카 말한다

답변:


33

또 다른 가능한 해결책 :

lsof -t -i :<port> -s <PROTO>:LISTEN

예를 들면 다음과 같습니다.

# lsof -i :22 -s TCP:LISTEN
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1392 root    3u  IPv4  19944      0t0  TCP *:ssh (LISTEN)
sshd    1392 root    4u  IPv6  19946      0t0  TCP *:ssh (LISTEN)
# lsof -t -i :22 -s TCP:LISTEN
1392

"lsof -t -i : 3000 TCP : LISTEN"을 시도하고 "lsof : TCP : LISTEN의 상태 오류 : 해당 파일 또는 디렉토리가 없습니다"오류가 발생 함
Dave

@Dave없이 실행하십시오 TCP:LISTEN.
Xiong Chiamiov

2
@Dave -s열쇠를 놓쳤습니다 . 패턴으로 수정했습니다. 예를 들어이 키가있었습니다.
Yurij Goncharuk

작업에 적합한 도구입니다.
Johannes Kuhn

10

이 시도:

pid=$(fuser 3000/tcp 2>/dev/null)

( psmisc패키지 필요 )

이것은 사용자 루트에 의해 실행될 때만 신뢰할 수 있습니다. 다른 사용자는 동일한 사용자로 실행중인 프로세스 만 찾을 수 있습니다.


예를 들어 루트 전용 액세스에 대한 지루한 설명.
어떤 방법을 사용하든 (fuser, ss, lsof, ...) 모두 사용 가능한 프로세스 설명자 목록을 사용 가능한 네트워크 연결 목록과 일치시킵니다 (예 : tcp에서 사용 가능 /proc/net/tcp).
예를 들어, 포트 22/tcp(22 = 0x0016)를 사용하여 pid를 얻으려고하면 이러한 종류의 비교가 끝납니다.

입국 /proc/net/tcp:
0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0

와:
dr-x------. 2 root root 0 May 14 17:59 /proc/358/fd lrwx------. 1 root root 64 May 14 17:59 /proc/358/fd/3 -> socket:[141408]

이 fd 디스크립터는 사용자 (이 예제에서는 root) 또는 root 만 사용할 수 있으므로 해당 사용자 또는 루트 만이 pid가 358임을 알 수 있습니다.


4

동안 lsof의이 -tPID를 얻을 수있는 가장 간단한 방법이며, lsof또한 사용하여 다른 필드를 선택하는 방법이 -F옵션을 :

$ lsof -F'?'
lsof:   ID    field description
     a    access: r = read; w = write; u = read/write
     c    command name
     d    device character code
     D    major/minor device number as 0x<hex>
     f    file descriptor (always selected)
     G    file flaGs
     i    inode number
     k    link count
     K    task ID (TID)
     l    lock: r/R = read; w/W = write; u = read/write
     L    login name
     m    marker between repeated output
     n    comment, name, Internet addresses
     o    file offset as 0t<dec> or 0x<hex>
     p    process ID (PID)
     g    process group ID (PGID)
     P    protocol name
     r    raw device number as 0x<hex>
     R    paRent PID
     s    file size
     S    stream module and device names
     t    file type
     T    TCP/TPI info
     u    user ID (UID)
     0    (zero) use NUL field terminator instead of NL

출력은 다음과 같습니다 (PID 및 파일 디스크립터는 항상 인쇄 됨).

$ sudo lsof -F cg -i :22 -s TCP:LISTEN 
p901
g901
csshd
f3
f4

따라서 PID 대신 프로세스 그룹 ID를 원하는 경우 다음을 수행 할 수 있습니다.

$ sudo lsof -F g -i :22 -s TCP:LISTEN | awk '/^g/{print substr($0, 2)}'
901

2

이것이 바로 당신이 필요로하는 것입니다

sudo lsof -n -i :3000  | awk '/LISTEN/{print $2}'
12726
12730
12732

1

주의 사항 : 나는 이것을 RedHat에서만 테스트 할 수 있습니다.

?로 가능해야합니다 netstat.

 sudo netstat -npl --inet | awk '/:3000/' | awk -F "[ /]+" '{print $7}'

-n 숫자 포트의 경우
-l 수신 포트의 경우
-p PID를 보려면

--inet 또는 --inet6 스위치를 사용 netstat하여 각각 IPv4 또는 IPv6 만 찾 도록 지시 할 수 있습니다. 그렇지 않으면 두 가지 결과가 발생할 수 있습니다.

또는 awk한 번만 인쇄하도록 지시 할 수 있습니다

sudo netstat -npl | awk '/:3000/' | awk -F "[ /]+" '{print $7; exit}' 

에서는 awk우리는 단지 '사용 / 로부터'를 netstat세퍼레이터로서 PID / 프로그램의 출력.

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