¿Cómo encontrar la ID de proceso (PID) de un programa de terminal en ejecución?


Respuestas:


128

Abra otra terminal y ejecute ps ax | grep foodonde foo es el nombre del programa que no responde. Esto debería devolver una línea de salida que se parece a esto:

$ ps ax | grep firefox
2222 ?        S      0:00 /bin/sh /usr/lib/firefox-3.6.9/firefox
2231 ?        Sl   514:36 /usr/lib/firefox-3.6.9/firefox-bin
30290 pts/2    S+     0:00 grep --color=auto firefox

El primer campo de cada línea de salida es un número que representa el ID de proceso del programa con el que coincide grep(puede ignorar con seguridad el último, que se representa a grepsí mismo).

Para detener el proceso ofensivo, haga: kill piddonde pid es la ID del proceso del programa. Es posible que tenga que usar su juicio sobre cuál de las coincidencias necesita ser killeditada, o podría usar topen su lugar. El uso killpor sí solo envía SIGTERM, que debe probar primero, ya que permite que el programa se limpie correctamente después de sí mismo. Si SIGTERM falla, intente SIGHUP, que es la medicina stonger: kill -HUP pid. Si todo lo demás falla, envíe SIGKILL. Pero, solo debe hacerlo como último recurso, porque SIGKILL hace que el núcleo finalice el proceso inmediatamente sin posibilidad de limpieza. Esto a veces puede resultar en corrupción de datos u otros problemas. De nuevo, solo envíe SIGKILL como último recurso. Para hacerlo, haz kill -KILL pido kill -9 pid.

Si está ejecutando una interfaz gráfica, por supuesto, no tiene que engañar con estas cosas locas de la línea de comandos para hacer el trabajo. Simplemente abra "Monitor de sistema", navegue a la pestaña Procesos, elija el proceso que desea detener (Hm, ¿podría ser el que usa una CPU del 90%?) Y haga clic derecho en él. Dado que el proceso ya está detenido, (ese es el problema, ¿verdad?), Elija Finalizar proceso o Eliminar proceso en el menú resultante.

Crédito a koanhead


55
La gente nunca debe usar SIGKILL (kill -9) a menos que todos los otros métodos hayan fallado. Solo el listado kill -9es un mal consejo. He editado la respuesta para corregirlo.
Scott Severance

¿Cómo puedo encontrar el pid de una función personalizada? Tengo una función que contiene un bucle con un pingcomando y sleep. De acuerdo con unix.stackexchange.com/a/275826/72988 , no es posible en Ubuntu sin multiplexer.
Timo

49

No creo que haya una necesidad de comandos tan largos cuando puedes ejecutar los mismos comandos con pgrep, pkill, pidof, etc.

  • Para obtener el pid de un programa en ejecución

pgrep:

   pgrep [options] pattern

DESCRIPCIÓN: pgrep examina los procesos que se ejecutan actualmente y enumera los ID de proceso que coinciden con los criterios de selección para stdout. Todos los criterios tienen que coincidir. Por ejemplo,

  • Para encontrar el proceso llamado sshd propiedad de root.

    $ pgrep -u root sshd
    
  • Enumere los procesos propiedad de root OR daemon.

    $ pgrep -u root,daemon
    

pidof:

DESCRIPCION :

Pidof encuentra la identificación del proceso (pids) de los programas nombrados. Imprime esas identificaciones en la salida estándar.

sintaxis: pidof nombre_programa

  • Para matar un programa pid usando el ejemplo pkill:

    pkill pid    
    pkill -f process_name    
    pkill -o process_name    
    pkill -n process_name    
    pkill -l process_name
    

    -fflag: busca el nombre de proceso (ver man pkill)
    -oflag: selecciona solo el más antiguo de los procesos coincidentes.
    -nflag: Seleccione solo el más nuevo de los procesos coincidentes.
    -lflag: muestra el nombre del proceso, así como el ID del proceso.


1
Esta es la mejor respuesta
BlackDivine

21

La forma más fácil de conocer el pid de un programa en ejecución es usar:

pidof <application name>

Por ejemplo, si inició vim y quiere saber su pid:

pidof vim

Recuerde que deberá proporcionar el nombre exacto del programa que se inició.

Por ejemplo, si ejecuta vi y ejecuta pidof vim, no obtendrá resultados correctos.

Consulte pidofla página del manual para obtener más información.


Esto no está instalado por defecto. Puede estar en el paquete sysvinit-utils.
flickerfly

Tengo MariaDB. pidof mysqlddevuelve un PID. Sin embargo, si escribo pidof Mariadbno se devuelve nada. ¿Es el mismo PID para MariaDB y MySQL?
Pathros

18

He descubierto que es bueno usar una búsqueda que no distingue entre mayúsculas y minúsculas agregando "-i" y usando "aux" en lugar de "ax" para obtener una salida más descriptiva:

ps aux | grep -i firefox

Si desea eliminar todos los procesos que puede usar:

ps aux | grep -i firefox | awk {'print $2'} | xargs kill -9

Esa es una muerte contundente. Suelta el "-9" si quieres una muerte suave.


55
¡Esto también mata el ps aux | grep -i firefox...proceso, porque contiene el texto firefoxen su comando!
Eric

1
@Eric se puede usar grep -i firefo[x]para combinar solo Firefox
AD

@ John-Foley nunca se aconseja para utilizar -9con kill, ver aquí explicaciones
AD

3

Si solo desea el pid (útil para scripts de autoajuste, etc.)

pgrep -f desired_program_name

1

Para aquellos con Ubuntu 16.04 LTS, se debe utilizar ps axy no sólops en la línea de comandos, de lo contrario se acaba de obtener los procesos de desove de la instancia terminal en particular que usted está en. (Por lo general sólo 'bash' [la capa que está en ] y 'ps' [lo que acabas de ejecutar])


Me gusta ps -e(muestra todo) y ps -ejH(muestra un árbol de procesos).
Andrew

1
@ Andrew agradable, eso es realmente muy dulce - gracias por el consejo
cygnus_x1

0

También puede abrir otro terminal (o cambiar a otro tty) y ejecutar top, que es básicamente una versión de texto del Monitor del sistema. La primera columna enumera el PID de cada proceso en ejecución, que puede eliminar presionando K, ingresando el PID y luego ingresando una señal numérica para enviar.


0

Podrías hacerlo:

ps ax | grep firefox | cut -f2 -d" " - | xargs kill -9

los primeros dos tubos obtienen información del proceso, luego intentamos obtener la columna PID usando el corte de la vieja escuela y luego le damos el PID resultante para matar.


kill -9es el arma más grande que tienes para matar un proceso. Debería probar una señal más suave al principio antes de recurrir a SIGKILL para darle al proceso la oportunidad de limpiar sus recursos.
Byte Commander

Eso es cierto @ByteCommander. Quería convertirlo en un trazador de líneas que haga el trabajo.
Arian Soltani

0
top

o

screen -list|ls

enumerar todos los pid con el proceso correspondiente

kill -[pid]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.