it-swarm.com.de

Töte alle Hintergrundjobs

Gibt es eine kompaktere Form der Beendigung von Hintergrundjobs als:

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

Außerdem enthält {1..5} offensichtlich eine fest codierte magische Zahl. Wie kann ich sie zu "N" machen, wobei N die richtige Zahl ist, ohne Folgendes zu tun:

$(jobs | wc -l)

Ich verwende\j in PS1 tatsächlich, um die Anzahl der verwalteten Jobs zu ermitteln. Ist dies äquivalent?

66
Robottinosino

Um nur kill alle von bash verwalteten Hintergrundjobs auszuführen

kill $(jobs -p)

Da sowohl jobs als auch kill in bash integriert sind, sollten keine Fehler vom Typ Argumentliste zu lang auftreten.

110
jw013

Verwenden Sie xargs anstelle des Unterbefehls $(jobs -p), denn wenn jobs -p ist leer, dann schlägt der Befehl kill fehl.

jobs -p | xargs kill
17
brunocascio

Ich bevorzuge es zu überprüfen, ob Jobs vorhanden sind, bevor ich sie beende. Auf diese Weise schlägt das Skript nicht fehl, wenn nichts ausgeführt wird.

Es ist auch kürzer zu tippen. Wirf das in dein .bash_profile:

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

Dann renne:

killjobs

Um alle laufenden Jobs zu beenden.

3
mikemaccana

Ich habe mehrere zusammengesetzte Hintergrundbefehle, die ich ordnungsgemäß beenden möchte, indem ich SIGINT an jeden Prozess unter macOS sende. Keine der anderen Lösungen hat dafür richtig funktioniert, also habe ich mir Folgendes ausgedacht:

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

jobs -p listet Hintergrundprozesse auf, die von der aktuellen Shell gestartet wurden.

xargs -n1 führt pkill einmal für jeden Job aus.

pkill -SIGINT -g sendet SIGINT (wie Strg + c) an alle Prozesse in der Prozessgruppe.

1
Clement Cherlin

Ich denke, je nachdem, welche Ausgabe jobs -p Gibt, könnte die Lösung etwas anders sein. In meinem Fall

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

Daher ist es nicht gut, Folgendes zu tun.

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

Andererseits funktioniert das Ausführen von kill $(jobs -p), führt jedoch zu vielen Fehlermeldungen, da die Nicht-PID-Zeichenfolgen auch an kill übergeben werden.

Daher besteht meine Lösung darin, zuerst die PID grep und dann xargs wie folgt zu verwenden:

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

Sieht aus als ob jobs -p | xargs kill erledigt den Job, erzeugt jedoch einige unerwünschte Ausgaben, die zum Töten weitergeleitet werden. Hier gruppiere ich die Ausgabe von jobs -p mit + oder - Zeichen

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

Und später können Sie einfach killjobs aufrufen

0
samvel1024