Jak w tytule - jak zabić wszystkie procesy w tle w zsh?Jak zabić wszystkie procesy w tle w zsh?
Odpowiedz
alias killbg='kill ${${(v)jobstates##*:*:}%=*}'
. To jest zsh, nie ma potrzeby w zewnętrznych narzędziach.
Jeśli chcesz zabić numer zadania N:
function killjob()
{
emulate -L zsh
for jobnum in [email protected] ; do
kill ${${jobstates[$jobnum]##*:*:}%=*}
done
}
killjob N
alias killbg='for job in \`jobs -l | egrep -o "([0-9][0-9]+)"`;
Super! Teraz spróbuj zawiesić 'echo 123 | less' i sprawdź, co zabije. Podpowiedź: do czasu uruchomienia 'kill'' proces echo 123' będzie już martwy, a jego PID może już zostać pobrane. Tak więc z zawieszoną rurą z 'killbg' możesz zabić 2 niewinne procesy: proces' 123' (argument 'echo') i proces, który spowodował odzyskanie' echo' PID. – ZyX
Moje rozwiązanie nie powiedzie się jednak w tym przypadku (spróbuje zabić '{echoPID} = done: {lessPID}'). – ZyX
Działa to zarówno dla zsh i 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
}
@zyx odpowiedź nie działa dla mnie.
Więcej o tym tutaj: https://gist.github.com/CMCDragonkai/6084a504b6a7fee270670fc8f5887eb4
Minor korekta @ odpowiedź ZXY za ...
W moim systemie, stwierdziliśmy, że zawieszone zadania nie zginęło poprawnie z sygnałem domyślny zabić. Musiałem faktycznie zmienić to na kill -KILL
, aby uzyskać suspended
zadań tła, aby umrzeć prawidłowo.
alias killbg='kill -KILL ${${(v)jobstates##*:*:}%=*}'
Zwróć szczególną uwagę na POJEDYNCZE CYTATY wokół tego. Jeśli przełączyłeś się na podwójne cudzysłowy, musisz uciec z każdego "$". Zauważ, że NIE możesz użyć function
do zawijania tego polecenia, ponieważ funkcja zwiększy tablicę $jobstates
powodując, że funkcja spróbuje zabić się ... Musi użyć aliasu.
killjob
skrypt powyżej jest nieco zbędny, ponieważ można po prostu zrobić:
kill %1
mniej klawiszy i to już budować w zsh
.
Jako "zsh' noob, umysł wyjaśniający ten pierwszy wiersz? –
@ZachRiggle Jest to w 'man zshexpn' i' man zshmodules': '$ jobstates' jest parametrem asocjacyjnej tablicy,' (v) 'wybiera tylko wartości z tej tablicy,' # 'sprawia, że zsh usuwa dany wzorzec od początku ciągu znaków, wybiera najmniejszy wzorzec do usunięcia, '*: *:': wzór, który powoduje, że zsh usuwa pierwsze dwa pola oddzielone dwukropkami dla każdej wartości ('#' dla parametrów tablicy jest stosowane do każdej wartości), '%' jest jak '#', ale na końcu łańcuchów i '= *' sprawia, że zsh usuwa wszystko po ostatnim znaku eq, włączając w to sam znak.Każda wartość '$ jobsstates' wygląda jak' job-state: mark: pid = state ... '. – ZyX
Wygląda na to, że mam tutaj błąd: nie działa, jeśli cała rura została zawieszona. – ZyX