別の可能な解決策:
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
これを試してください:
pid=$(fuser 3000/tcp 2>/dev/null)
(psmisc
が必要です パッケージ)
これは、ユーザー root によって実行された場合にのみ信頼できることに注意してください。他のユーザーは、同じユーザーで実行されているプロセスを見つけることしか期待できません。
root のみのアクセスの退屈な説明は、こちらの例を使用してください。
使用されたメソッド (fuser、ss、lsof、...) に関係なく、それらはすべて、プロセスの記述子の利用可能なリストをネットワーク接続の利用可能なリストに一致させます (たとえば、tcp の場合、/proc/net/tcp
で利用可能です)。 )。
たとえば、ポート 22/tcp
を使用して pid を取得しようとすると、 (with 22 =0x0016) は、次のような比較を行うことになります:
/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 のみが使用できるため、そのユーザーまたは root のみが pid が 358 であることを知ることができます。
lsof
の間 の -t
PID 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