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

49

Sé que pkilltiene más reglas de filtrado que killall. Mi pregunta es, ¿cuál es la diferencia entre:

pkill [signal] name

y

killall [signal] name

He leído que killalles más efectivo y elimina todos los procesos y subprocesos (y recursivamente) que coinciden con el nameprograma. pkillno hace esto también?

mavillan
fuente
Relacionado: unix.stackexchange.com/questions/252349/…
Byte Commander

Respuestas:

46

Las utilidades pgrepy pkillse introdujeron en Sun's Solaris 7 y, como señaló g33klord , toman un patrón como argumento que coincide con los nombres de los procesos en ejecución. Si bien pgrepsimplemente imprime una lista de procesos coincidentes, pkillenviará la señal especificada (o SIGTERMpor defecto) a los procesos. Las opciones comunes y la semántica entre pgrepy pkillson útiles cuando desea tener cuidado y primero revise los procesos de comparación de listas con pgrep, luego proceda a eliminarlos con pkill. pgrepy pkillse proporcionan por el los procps paquete, que también proporciona otras /procutilidades del sistema de archivos, tales como ps, top, free, uptimeentre otros.

El killallcomando es proporcionado por el paquete psmisc , y difiere de pkilleso, de manera predeterminada, coincide exactamente con el nombre del argumento (hasta los primeros 15 caracteres) al determinar las señales de proceso a las que se enviarán. La opción -e, --exactse puede especificar para que también requiera coincidencias exactas para nombres de más de 15 caracteres. Esto hace que sea killallalgo más seguro de usar en comparación con pkill. Si el argumento especificado contiene caracteres de barra diagonal ( /), el argumento se interpreta como un nombre de archivo y los procesos que ejecutan ese archivo en particular se seleccionarán como destinatarios de la señal. killalltambién soporta expresiones regulares de nombres de proceso, a través de la -r, --regexpopción.

Hay otras diferencias también. El killallcomando, por ejemplo, tiene opciones para unir procesos por edad ( -o, --older-thany -y, --younger-than), mientras pkillque se le puede decir que solo mate procesos en un terminal específico (a través de la -topción). Claramente, entonces, los dos comandos tienen nichos específicos.

Tenga en cuenta que el killallcomando en sistemas descendientes de Unix System V (especialmente Sun's Solaris , IBM's AIX y HP's HP-UX ) mata todos los procesos que un usuario en particular puede matar , cerrando efectivamente el sistema si se ejecuta desde la raíz.

Las utilidades psmisc de Linux se han portado a BSD (y en la extensión Mac OS X ), por lo tanto, killallsigue la semántica "matar procesos por nombre".

Thomas Nyman
fuente
La principal diferencia que he encontrado es detener los comandos de un patrón por parte de un usuario killall -u <username> -r <process>o pkill <process> -U <uid>lo que killallme facilita mucho el uso.
jeremysprofile
13

pkilles el que vale la pena enseñar a las generaciones futuras, tanto por los filtros que mencionas como por el hecho de que se combina con los altamente reutilizables pgrep. Eliminan los procesos de la misma manera, y ninguno mata de forma recursiva, aunque con pgrep, puede seleccionar por sesión (por tty, think setsid) o grupo de procesos (think control de trabajo).

Gabriel
fuente
8

Una diferencia es que killalltoma el nombre exacto del proceso como argumento, mientras que pkillpuede tomar un nombre parcial o completo.

Puede consultar esta pregunta para conocer en profundidad sobre pkill

electropoet
fuente
1

killall- Eliminar procesos por nombre. Utilice el killallcomando para enviar una señal a uno o más procesos que coincidan con los criterios de selección, como el nombre del comando, los procesos propiedad de un usuario específico o todos los procesos de todo el sistema.

pkill- enviará la señal especificada (por defecto SIGTERM) a cada proceso en lugar de enumerarlos en stdout. pkillpuede señalar múltiples procesos como killall, pero también puede usar criterios de selección avanzados que pueden incluir cualquier combinación de:

Comando UID Terminal principal

usuario196507
fuente