¿Cuál es la diferencia entre 'killall' y 'pkill'?

88

Después de usar simplemente kill <some_pid> en sistemas Unix durante muchos años, aprendí pkill de un colega más joven y experto en Linux 1 .

Pronto acepté Linux-way, pgrep -ing y pkill -ing durante muchos días y noches, a través de ralentizaciones y condiciones de carrera. Esto estuvo todo bien.

Pero ahora no veo nada más que killall . Los procedimientos parecen solo mencionar killall , y no estoy seguro si esto es algún tipo de desarrollo paralelo, o si killall es un sucesor de pkill , o algo más.

Parece funcionar como un pkill más orientado, pero estoy seguro de que me falta algo.

¿Puede una persona de Debian / Debian-savvy 2 explicar cuándo (o por qué) se debe usar killall , especialmente si se debe usar con preferencia a pkill (cuando pkill a menudo parece más fácil, porque puedo ser más descuidado con la coincidencia de nombres, al menos por defecto).

Cuando hablo de killall , no estoy pensando en el comando que en algunos sistemas Unix (Solaris, AIX,?) mataría a todos los procesos de usuario. Aquí hay una descripción de esa versión, de una página de manual para AIX de IBM :

  

El comando killall cancela todo   procesos que comenzó, excepto   aquellos que producen el proceso killall.   Este comando proporciona una conveniente   medios para cancelar todos los procesos   creado por el proyectil que controlas   Cuando lo inicia un usuario raíz, el   El comando killall cancela todo   procesos cancelables excepto aquellos   procesos que lo iniciaron. Si varios   Se especifican las señales, solo la última   uno es efectivo.

1 'colega' es una actualización gratuita de 'compañero de trabajo', por lo que también podría serlo.
2 Originalmente pensé que esto era algo de Linux o Debian , pero algunas fuentes dicen que Linux killall se deriva de Unix con sabor BSD.

    
pregunta belacqua 22.02.2011 - 08:31

4 respuestas

64

Creo que ves killall en how-to's porque de forma predeterminada requiere el nombre del proceso preciso, mientras que pkill hace una coincidencia básica de patrones. Por lo tanto, killall es más seguro para que los usuarios copien y peguen a ciegas.

Pkill y killall tienen opciones distintivas. Killall tiene una bandera que coincide con la edad del proceso, pkill tiene una bandera que solo mata procesos en un tty determinado. Etcétera ad nauseum. Ninguno de los dos es mejor , solo tienen diferentes especialidades.

Veo en sus páginas man que killall proviene del paquete psmisc , que tiene varias herramientas de administración de procesos, pero que no contiene ps . Es el paquete procps que tiene ps, top, kill y pkill (entre otros). Apostaría a que los procps no tenían originalmente pkill, por lo que el psmisc se rascó y se le ocurrió el killall.

La página man de pkill / pgrep dice que se introdujeron en Solaris 7. Como mencionas, jgbelacqua , el killall de Solaris no era la utilidad que proporciona psmisc, por lo que Solaris probablemente solo tenía el paquete procps. Alguien quería una herramienta de proceso de coincidencia de patrones, por lo tanto pkill y pgrep. Ya sea que haya sido desarrollado por procps dev o agregado después, no lo sé. De todos modos, lo hizo y se convirtió en parte de * nixes en todas partes.

Más fuentes:

respondido por el djeikyb 22.02.2011 - 09:06
7

Tenga cuidado con "killall". En algunos sistemas (se me olvida cuál), killall mata a todos procesos. Silenciosamente ignorará los argumentos y hará que su sistema se detenga por completo.

    
respondido por el phessler 30.07.2012 - 10:26
3

si activa / etc / bash_completion, después de killall <part_of_process_name> y pulse tab - auto completa el nombre del proceso de la lista de procesos en ejecución

    
respondido por el jet 22.02.2011 - 13:28
2

Si mira las opciones en ambos programas, verá que ambos hacen lo mismo, pero de diferentes maneras.

pkill realizará la coincidencia en varios atributos de un proceso (CMD, PID, PPID, UID ...) y enviará la señal dada a cada proceso que coincida. (Para CMD, se usa una expresión regular, para otros es una cadena). pkill no es interactivo, pero es mejor para programas por lotes.

killall realizará la coincidencia en el nombre del proceso (comm) o usuario (usuario), no en toda la cadena de comandos. El argumento se usa como una cadena simple y debe coincidir con todo el valor 'comm' (también hay una opción --regexp para cambiar esto). killall tiene opciones interactivas y más jóvenes que las opciones, que pkill no tiene.

También hay un killall5 de SysV días y fue portado a otras variantes de UNIX (supuestamente en el paquete de Ubuntu 'sysutils'). Esto se comporta de manera diferente a la vieja usanza. A menudo se usaba internamente en las secuencias de comandos de inicio para apagar o cambiar al modo de usuario único.

    
respondido por el Arcege 22.02.2011 - 14:24

Lea otras preguntas en las etiquetas