GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo eliminar todos los procesos en segundo plano en zsh?

Esto funciona tanto para ZSH como para Bash:

: '
killjobs - Run kill on all jobs in a Bash or ZSH shell, allowing one to optionally pass in kill parameters

Usage: killjobs [zsh-kill-options | bash-kill-options]

With no options, it sends `SIGTERM` to all jobs.
'
killjobs () {

    local kill_list="$(jobs)"
    if [ -n "$kill_list" ]; then
        # this runs the shell builtin kill, not unix kill, otherwise jobspecs cannot be killed
        # the `[email protected]` list must not be quoted to allow one to pass any number parameters into the kill
        # the kill list must not be quoted to allow the shell builtin kill to recognise them as jobspec parameters
        kill [email protected] $(sed --regexp-extended --quiet 's/\[([[:digit:]]+)\].*/%\1/gp' <<< "$kill_list" | tr '\n' ' ')
    else
        return 0
    fi

}

La respuesta de @zyx no funcionó para mí.

Más sobre esto aquí:https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4


uno debe usar el builtin Comando integrado zsh junto con el otro kill Comando integrado zsh como:

builtin kill %1

como kill también es un archivo binario separado de util-linux paquete (upstream, espejo) ubicado en /usr/bin/kill que no admite empleos (kill: cannot find process "%1" ).

use la palabra clave builtin para evitar conflictos de nombres o enable el kill incorporado si está deshabilitado.

existe un concepto de deshabilitar y habilitar comandos incorporados (es decir, los propios comandos de shell como cd y kill ) en shells, y en zsh puede habilitar (un deshabilitado) kill incorporado como:

enable kill

problema disable para verificar si el incorporado está deshabilitado (y enable para ver las habilitadas).


alias killbg='kill ${${(v)jobstates##*:*:}%=*}'

. Es zsh, no necesita herramientas externas.

Si quieres eliminar el trabajo número N:

function killjob()
{
    emulate -L zsh
    for jobnum in [email protected] ; do
        kill ${${jobstates[$jobnum]##*:*:}%=*}
    done
}
killjob N

Ajuste menor a la respuesta de @Zxy...

En mi sistema, descubrí que los trabajos suspendidos no se eliminaron correctamente con la señal de eliminación predeterminada. De hecho, tuve que cambiarlo a kill -KILL para obtener suspended trabajos de fondo para morir correctamente.

alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'

Preste especial atención a las COMILLAS SIMPLES alrededor de esto. Si cambiaste a comillas dobles, tendrías que escapar de cada "$". Tenga en cuenta que NO puede usar un function para envolver este comando ya que la función incrementará el $jobstates matriz que hace que la función intente suicidarse... Debe usar un alias.

El killjob el script de arriba es un poco redundante ya que puedes hacer:

kill %1

Menos pulsaciones de teclas y ya está integrado en zsh .


Linux
  1. ¿Cómo eliminar todos los procesos propiedad del `usuario` en Centos 7?

  2. Elimine todos los procesos de un usuario específico a través de SSH

  3. Cómo matar procesos en ejecución en Linux

  4. ¿Cómo encontrar todos los procesos secundarios?

  5. Cómo eliminar todos los procesos devueltos por pgrep

¿Cómo matar un proceso en Linux? Comandos para Terminar

Cómo matar procesos Zombie en Linux

Cómo enviar procesos a segundo plano en Linux

Cómo matar procesos Zombie en Ubuntu

Cómo eliminar procesos de MySQL en phpMyAdmin

¿Cómo elimino los procesos anteriores a t?