J'utilise CentOS 7. Je veux obtenir le PID (s'il existe) du processus en cours d'exécution sur le port 3000. Je voudrais obtenir ce PID afin de le sauvegarder dans une variable dans un script shell. Jusqu'à présent, j'ai
[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))
mais je ne peux pas comprendre comment isoler le PID tout seul sans toutes ces informations supplémentaires.
sudo ss -lptnH "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
. Avez-vous besoin d'explications?ss
sans de cette option. Devrait fonctionner même sans:sudo ss -lptn "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
Réponses:
Une autre solution possible:
Par exemple:
la source
TCP:LISTEN
.-s
clé. Je l'ai corrigé dans le modèle. Un exemple avait cette clé.Essaye ça:
(nécessite un
psmisc
package)Veuillez noter que cela n'est fiable que lorsqu'il est exécuté par l'utilisateur root. Les autres utilisateurs ne peuvent qu'espérer trouver des processus exécutés avec le même utilisateur.
Explication ennuyeuse pour l'accès root uniquement avec un exemple ici.
Quelle que soit la méthode utilisée (fuser, ss, lsof, ...), ils finissent tous par faire correspondre la liste disponible des descripteurs de processus à une liste disponible de connexions réseau (par exemple pour TCP il est disponible en
/proc/net/tcp
).Par exemple, essayer d'obtenir le pid en utilisant le port
22/tcp
(avec 22 = 0x0016) finirait par faire ce genre de comparaison:Entrée de
/proc/net/tcp
:0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0
avec:
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]
Comme ce descripteur fd est uniquement disponible pour son utilisateur (qui se trouve être root dans cet exemple) ou root, seul cet utilisateur ou root peut découvrir que le pid est 358.
la source
Bien que
lsof
's-t
soit le moyen le plus simple d'obtenir le PID,lsof
il a également des moyens de sélectionner d'autres champs en utilisant l'-F
option:Avec une telle sortie (notez que le PID et les descripteurs de fichiers sont toujours imprimés):
Donc, si vous vouliez l'ID du groupe de processus au lieu du PID, vous pouvez faire:
la source
C'est exactement ce dont vous avez besoin
la source
Avertissement: je ne peux tester cela que sur RedHat.
Devrait être possible avec
netstat
?-n pour les ports numériques
-l pour les ports d'écoute
-p pour voir les PID
Vous pouvez utiliser les commutateurs --inet ou --inet6 pour indiquer
netstat
de ne rechercher que IPv4 ou IPv6 respectivement, sinon vous pourriez obtenir deux résultats.Alternativement, vous pouvez dire
awk
d'imprimer une seule foisDans
awk
nous utilisons simplement la sortie ' / ' denetstat
'du programme PID / comme séparateur.la source