GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je obtenir uniquement le PID, sans aucune information supplémentaire, d'un processus exécuté sur le port 3000 ?

Autre solution possible :

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

Par exemple :

# 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

Essayez ceci :

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

(nécessite psmisc paquet)

Veuillez noter que ceci n'est fiable que lorsqu'il est exécuté par l'utilisateur root. Les autres utilisateurs ne peuvent qu'espérer trouver des processus en cours d'exécution 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 dans /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 à partir 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 n'est disponible que 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.


Alors que lsof est -t est le moyen le plus simple d'obtenir le PID, lsof a également des moyens de sélectionner d'autres champs en utilisant le -F choix :

$ 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

Avec une sortie comme celle-ci (notez que le PID et les descripteurs de fichier sont toujours imprimés) :

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

Donc, si vous vouliez l'ID du groupe de processus au lieu du PID, vous pourriez faire :

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

Linux
  1. Comment obtenir le chemin d'un processus sous Unix / Linux

  2. Comment faire passer les arguments de ligne de commande à un processus en cours d'exécution sur les systèmes unix/linux ?

  3. Comment tuer un processus en cours d'exécution sur un port particulier sous Linux ?

  4. Comment obtenir uniquement tous les identifiants de processus en cours d'exécution ?

  5. Comment puis-je obtenir l'heure de l'horloge murale d'un processus en cours d'exécution ?

Comment tuer le processus Linux en cours d'exécution sur un port particulier

Linux - Comment obtenir l'heure de l'horloge murale d'un processus en cours d'exécution ?

Comment trouver le PID et le PPID d'un processus sous Linux

Comment obtenir uniquement l'utilisateur, le pid et la commande exécutée pour un processus spécifique ? (Ubuntu 11.10)

Comment récupérer par programmation le GID d'un processus en cours d'exécution

Comment obtenir le pid du processus qui vient de démarrer