it-swarm-eu.dev

Zabijte všechny úlohy na pozadí

Existuje mnohem kompaktnější forma zabíjení úloh na pozadí než:

for i in {1..5}; do kill %$i; done

Také {1..5} má v sobě očividně pevně zakódované magické číslo, jak ho mohu označit jako „N“, když N je správné číslo, aniž bych udělal:

$(jobs | wc -l)

Ve skutečnosti používám\j v PS1 k získání # spravovaných úloh, je to ekvivalent?

66
Robottinosino

Chcete-li pouze kill, všechny úlohy na pozadí spravované programem bash

kill $(jobs -p)

Všimněte si, že protože jak jobs, tak kill jsou zabudovány do bash, neměli byste narazit na žádné chyby typu Argument příliš dlouhý.

110
jw013

Místo dílčího příkazu $(jobs -p) použijte xargs, protože pokud jobs -p je prázdné, příkaz kill se nezdaří.

jobs -p | xargs kill
17
brunocascio

Dávám přednost tomu, abych před zabitím zkontroloval, zda existují nějaké úlohy - tímto způsobem skript selže, pokud nebude nic spuštěno.

Je také kratší psát. Házejte to do svého .bash_profile:

function killjobs () {
    JOBS="$(jobs -p)";
    if [ -n "${JOBS}" ]; then;
        kill -KILL ${JOBS};
    fi
}

Pak spusťte:

killjobs

Chcete-li zabít všechny spuštěné úlohy.

3
mikemaccana

Mám několik pozadí složených příkazů, které chci elegantně ukončit odesláním SIGINTu do každého procesu, na MacOS. Žádné jiné řešení na to nepracovalo správně, takže jsem přišel s tímto:

jobs -p | xargs -n1 pkill -SIGINT -g

jobs -p uvádí procesy na pozadí spuštěné aktuálním Shell.

xargs -n1 provede pkill jednou pro každou úlohu.

pkill -SIGINT -g pošle SIGINT (stejný jako ctrl + c) do všech procesů ve skupině procesů.

1
Clement Cherlin

Myslím, že v závislosti na tom, jaký výstup dává jobs -p, By se řešení mohlo mírně lišit. V mém případě

$ jobs -p
[1]  - 96029 running    some job
[2]  + 96111 running    some other job

Proto není dobré dělat následující.

$ jobs -p | xargs kill
kill: illegal process id: [1]

Na druhé straně, spuštění kill $(jobs -p) funguje, ale vyžaduje spoustu chybových zpráv, protože non-PID řetězce dostanou také kill.

Proto je mým řešením nejprve grep PID a potom použijte xargs takto:

$ jobs -p | grep -o -E '\s\d+\s' | xargs kill
1
Fanchen Bao

Zdá se, jako jobs -p | xargs kill provádí tuto úlohu, ale produkuje nějaký nežádoucí výstup určený k zabití. Zde seskupuji výstup jobs -p tím, že máte/nemáte znak + nebo -

function killjobs() {
    JOBS=$(jobs -p)
    echo $JOBS | grep -v "+\|-"| awk '{print $2}' | xargs kill -9
    echo $JOBS | grep "+\|-"| awk '{print $3}' | xargs kill -9
}

A později stačí zavolat killjobs

0
samvel1024