Gibt es eine kompaktere Form zum Beenden 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, um die Anzahl der verwalteten Jobs zu ermitteln. Ist das äquivalent?
kill $(jobs -p)
scheint einfacher.for pid in $(jobs -p); do kill $pid; done
?jobs
die nur funktioniert, wenn die Jobs fortlaufend nummeriert werden. Oh, und "Jobs einzeln beenden" ist bedeutungslos: Das Übergeben mehrerer PIDs an denkill
Befehl bewirkt genau dasselbe wie das separate Übergeben.Antworten:
Um nur
kill
alle von verwalteten Hintergrundjobs anzuzeigenbash
, gehen Sie wie folgt vorBeachten Sie, dass Sie, da beide
jobs
und integriertkill
sindbash
, keine Fehler der Argumentliste mit zu langem Typ erhalten sollten.quelle
zsh
sie als Autorität auf diesem Gebiet zu disqualifizieren.kill %${(k)^jobdirs}
, was in der Tat länger ist; Wenn Sie die PIDs auflisten müssen, können Sie die noch länger verwenden${${jobstates#*:*:}%%=*}
.>
Verwenden Sie
xargs
anstelle des$(jobs -p)
Unterbefehls, dajobs -p
der Befehl kill fehlschlägt , wenn er leer ist.quelle
jobs -p | xargs -rn10 kill
wird es besser machen, wennjobs -p
keine PIDs zurückgegeben werden. Beachten Sie, dass es sich bei dieser-r
Option um eine GNU-Erweiterung handelt.-r
ist dies das Kurzformat für die--no-run-if-empty
GNU-Erweiterung, mitxargs
der angewiesen wird, den Befehl nicht auszuführen, wenn stdin keine Daten enthält.Ich bevorzuge es, zu prü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. Werfen Sie dies in Ihre
.bash_profile
:Dann renne:
Um laufende Jobs zu beenden.
quelle
Ich habe mehrere zusammengesetzte Befehle im Hintergrund, 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, daher habe ich mir Folgendes ausgedacht:
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.quelle
Ich denke, je nachdem, welche Ausgabe es
jobs -p
gibt, könnte die Lösung leicht abweichen. In meinem FallDaher ist das Folgende nicht gut.
Auf der anderen Seite
kill $(jobs -p)
funktioniert das Ausführen , bringt jedoch viele Fehlermeldungen mit sich, da auch die Nicht-PID-Zeichenfolgen übergeben werdenkill
.Daher ist meine Lösung, zuerst
grep
die PID und dannxargs
wie folgt zu verwenden:quelle
echo $0
zeigt? Washelp jobs
zeigt? Die abgebildete Ausgabe ist nicht POSIX-kompatibel . Jede Implementierung vonjobs
sollte eine-p
Option mit dem beabsichtigten Verhalten haben.jobs -p
habe nur PID ausgegeben. Ich habe gerade erfahren, dass zsh nicht vollständig POSIX-kompatibel ist.Scheint, als ob
jobs -p | xargs kill
der Job erledigt ist, erzeugt jedoch einige unerwünschte Ausgaben, die zum Töten weitergeleitet werden. Hier gruppiere ich die Ausgabejobs -p
von mit / ohne + oder - ZeichenUnd später kannst du einfach anrufen
killjobs
quelle