GNU/Linux >> Tutoriels Linux >  >> Linux

Comment tuer tous les processus d'arrière-plan dans zsh ?

Cela fonctionne à la fois pour ZSH et 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 réponse de @zyx n'a pas fonctionné pour moi.

Plus d'informations ici :https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4


il faut utiliser le builtin la commande intégrée zsh avec l'autre kill commande intégrée zsh comme :

builtin kill %1

comme kill est également un fichier binaire séparé à partir de util-linux package (amont, miroir) situé dans /usr/bin/kill qui ne prend pas en charge les emplois (kill: cannot find process "%1" ).

utilisez le mot-clé builtin pour éviter les conflits de noms ou enable le kill intégré s'il est désactivé.

il existe un concept de désactivation et d'activation des commandes intégrées (c'est-à-dire les propres commandes du shell telles que cd et kill ) dans les shells, et dans zsh, vous pouvez activer (désactivé) kill intégré comme :

enable kill

émettre disable pour vérifier si le builtin est désactivé (et enable pour voir ceux qui sont activés).


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

. C'est zsh, pas besoin d'outils externes.

Si vous voulez tuer le travail numéro N :

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

Ajustement mineur de la réponse de @Zxy...

Sur mon système, j'ai constaté que les travaux suspendus n'étaient pas correctement supprimés avec le signal de suppression par défaut. J'ai dû le changer en kill -KILL pour obtenir suspended les tâches d'arrière-plan disparaissent correctement.

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

Portez une attention particulière aux CITATIONS SIMPLES autour de cela. Si vous passez aux guillemets doubles, vous devrez échapper chaque "$". Notez que vous ne pouvez PAS utiliser un function pour envelopper cette commande puisque la fonction incrémentera le $jobstates tableau obligeant la fonction à essayer de se tuer... Doit utiliser un alias.

Le killjob le script ci-dessus est un peu redondant puisque vous pouvez simplement faire :

kill %1

Moins de frappes et c'est déjà intégré à zsh .


Linux
  1. Comment tuer tous les processus avec un nom partiel donné ?

  2. Comment tuer tous les processus PHP-FPM en une seule ligne de commande

  3. Comment utiliser Ctrl+C pour tuer tous les processus d'arrière-plan démarrés dans un script Bash ?

  4. Comment tuer tous les processus d'un utilisateur à l'aide de son UID

  5. Tuez tous les processus liés à une application

Comment tuer un processus sous Linux ? Commandes pour terminer

Comment tuer les processus Zombie sous Linux

Comment tuer les processus en cours d'exécution sous Linux

Comment envoyer des processus en arrière-plan sous Linux

Comment tuer les processus zombies dans Ubuntu

Comment tuer les processus MySQL dans phpMyAdmin