Ich verwende CentOS 7. Ich möchte die PID (falls vorhanden) des auf Port 3000 ausgeführten Prozesses abrufen. Ich möchte diese PID abrufen, um sie in einer Variablen in einem Shell-Skript zu speichern. Soweit habe ich
[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))
aber ich kann nicht herausfinden, wie man die PID ohne all diese zusätzlichen Informationen isoliert.
linux
shell-script
process
port
Dave
quelle
quelle
sudo ss -lptnH "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
. Benötigen Sie eine Erklärung?ss
ohne diese Option. Sollte auch ohne funktionieren:sudo ss -lptn "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
Antworten:
Eine andere mögliche Lösung:
Beispielsweise:
quelle
TCP:LISTEN
.-s
Schlüssel vermisst . Ich habe es in Muster behoben. Ein Beispiel hatte diesen Schlüssel.Versuche dies:
(benötigt
psmisc
Paket)Bitte beachten Sie, dass dies nur dann zuverlässig ist, wenn es vom Benutzer root ausgeführt wird. Andere Benutzer können nur hoffen, Prozesse zu finden, die mit demselben Benutzer ausgeführt werden.
Langweilige Erklärung für root nur mit einem Beispiel hier.
Unabhängig von der verwendeten Methode (fuser, ss, lsof, ...) stimmen alle die verfügbaren Prozessdeskriptoren mit den verfügbaren Netzwerkverbindungen überein (z. B. für tcp ist dies in verfügbar
/proc/net/tcp
).Wenn Sie beispielsweise versuchen, die PID über den Port
22/tcp
(mit 22 = 0x0016) abzurufen, wird der folgende Vergleich durchgeführt:Eintrag von
/proc/net/tcp
:0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0
mit:
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]
Da dieser fd-Deskriptor nur für seinen Benutzer (der in diesem Beispiel root ist) oder root verfügbar ist, kann nur dieser Benutzer oder root feststellen, dass die pid 358 lautet.
quelle
Während
lsof
‚s-t
der einfachste Weg ist , um die PID zu bekommen,lsof
hat auch auf andere Weise Felder mit der Auswahl-F
Option:Bei Ausgabe wie folgt (beachten Sie, dass PID- und Dateideskriptoren immer gedruckt werden):
Wenn Sie also die Prozessgruppen-ID anstelle der PID benötigen, können Sie Folgendes tun:
quelle
Genau das brauchen Sie
quelle
Einschränkung: Ich kann das nur mit RedHat testen.
Sollte mit möglich sein
netstat
?-n für numerische Ports
-l zum Abhören von Ports
-p zum Anzeigen von PIDs
Sie können die Optionen --inet oder --inet6 verwenden , um anzugeben , dass
netstat
nur nach IPv4 oder IPv6 gesucht werden soll. Andernfalls erhalten Sie möglicherweise zwei Ergebnisse.Alternativ können Sie festlegen
awk
, dass nur einmal gedruckt werden sollIn verwenden
awk
wir einfach das ' / ' vonnetstat
's Ausgabe von PID / program als Trennzeichen.quelle