Używam CentOS 7. Chcę uzyskać PID (jeśli taki istnieje) procesu działającego na porcie 3000. Chciałbym uzyskać ten PID w celu zapisania go w zmiennej w skrypcie powłoki. Do tej pory mam
[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))
ale nie mogę wymyślić, jak samodzielnie wyodrębnić PID bez tych wszystkich dodatkowych informacji.
linux
shell-script
process
port
Dave
źródło
źródło
sudo ss -lptnH "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
. Potrzebujesz wyjaśnienia?ss
bez tej opcji. Powinien działać nawet bez niego:sudo ss -lptn "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
Odpowiedzi:
Inne możliwe rozwiązanie:
Na przykład:
źródło
TCP:LISTEN
.-s
klucza. Naprawiłem to we wzór. Przykład miał ten klucz.Spróbuj tego:
(wymaga
psmisc
pakietu)Należy pamiętać, że jest to niezawodne tylko wtedy, gdy jest uruchamiane przez użytkownika root. Inni użytkownicy mogą mieć tylko nadzieję, że znajdą procesy działające z tym samym użytkownikiem.
Nudne wytłumaczenie dostępu tylko do roota z przykładem tutaj.
Bez względu na zastosowaną metodę (fuser, ss, lsof, ...) wszystkie kończą dopasowywanie dostępnej listy deskryptorów procesu do dostępnej listy połączeń sieciowych (np. Dla tcp, w której jest dostępna
/proc/net/tcp
).Na przykład próba uzyskania identyfikatora PID przy użyciu portu
22/tcp
(z 22 = 0x0016) zakończy się takim rodzajem porównania:Wpis z
/proc/net/tcp
:0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0
z:
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]
Ponieważ ten deskryptor fd jest dostępny tylko dla jego użytkownika (który w tym przykładzie jest rootem) lub root, tylko ten użytkownik lub root może dowiedzieć się, że pid to 358.
źródło
Chociaż
lsof
jest-t
to najprostszy sposób, aby uzyskać PID,lsof
ma również sposoby, aby wybrać inne pola za pomocą-F
opcji:Z takim wyjściem (pamiętaj, że PID i deskryptory plików są zawsze drukowane):
Więc jeśli chcesz identyfikator grupy procesów zamiast PID, możesz:
źródło
Właśnie tego dokładnie potrzebujesz
źródło
Uwaga: Mogę to przetestować tylko na RedHat.
Czy powinno być możliwe
netstat
?-n dla portów numerycznych
-l dla portów nasłuchiwania
-p aby zobaczyć PID
Możesz użyć przełączników --inet lub --inet6 , aby nakazać
netstat
wyszukiwanie tylko odpowiednio IPv4 lub IPv6, w przeciwnym razie możesz uzyskać dwa wyniki.Alternatywnie możesz powiedzieć,
awk
aby wydrukować tylko razW
awk
po prostu użyć „ / ” znetstat
„s wyjście PID / programu jako separatora.źródło