GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo obtengo solo el PID, sin ninguna información adicional, de un proceso que se ejecuta en el puerto 3000?

Otra posible solución:

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

Por ejemplo:

# 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

Prueba esto:

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

(requiere psmisc paquete)

Tenga en cuenta que esto es confiable solo cuando lo ejecuta el usuario root. Otros usuarios solo pueden esperar encontrar procesos ejecutándose con el mismo usuario.

Explicación aburrida para el acceso solo a la raíz con un ejemplo aquí.
Cualquiera que sea el método utilizado (fuser, ss, lsof, ...) todos terminan haciendo coincidir la lista disponible de descriptores de procesos con una lista disponible de conexiones de red (por ejemplo, para tcp está disponible en /proc/net/tcp ).
Por ejemplo, intentar obtener el pid usando el puerto 22/tcp (con 22 =0x0016) terminaría haciendo este tipo de comparación:

Entrada desde /proc/net/tcp :
0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0

con:
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]

Como este descriptor fd solo está disponible para su usuario (que resulta ser root en este ejemplo) o root, solo ese usuario o root puede descubrir que el pid es 358.


Mientras que lsof de -t es la forma más sencilla de obtener el PID, lsof también tiene formas de seleccionar otros campos usando el -F opción:

$ 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

Con una salida como esta (tenga en cuenta que los descriptores de archivo y PID siempre se imprimen):

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

Entonces, si quisiera la ID del grupo de procesos en lugar del PID, podría hacer:

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

Linux
  1. Linux:¿cómo obtener la hora del reloj de pared de un proceso en ejecución?

  2. ¿Cómo obtener el Tty en el que se está ejecutando Bash?

  3. ¿Cómo eliminar un proceso que se ejecuta en un puerto específico en Linux?

  4. ¿Cómo ver los procesos en ejecución de cualquier usuario en SSH?

  5. ¿Cómo pasar los argumentos de la línea de comando a un proceso en ejecución en sistemas Unix/Linux?

Cómo matar el proceso de ejecución de Linux en un puerto particular

Cómo encontrar el PID y PPID de un proceso en Linux

¿Cómo obtener la identificación del proceso para eliminar un proceso nohup?

Cómo obtener solo el número de líneas de un archivo

¿Cómo obtener PID por nombre de proceso?

¿Cómo obtener solo todos los ID de proceso en ejecución?