Czy istnieje bardziej zwarta forma zabijania zadań w tle niż:
for i in {1..5}; do kill %$i; done
Ponadto {1..5} ma oczywiście zakodowaną na stałe magiczną liczbę, jak mogę ustawić ją jako „N”, przy czym N jest właściwą liczbą, bez robienia:
$(jobs | wc -l)
Używam \ j na PS1, aby uzyskać # zarządzanych zadań, czy to równoważne?
kill $(jobs -p)
wydaje się łatwiejsze.for pid in $(jobs -p); do kill $pid; done
?jobs
które działa tylko wtedy, gdy zadania są kolejno numerowane. Aha, i „zabijaj zadania indywidualnie” nie ma znaczenia: przekazywanie wielu PID dokill
polecenia robi dokładnie to samo, co przekazywanie ich osobno.Odpowiedzi:
Aby tylko
kill
wszystkie zadania w tle zarządzane przezbash
, wykonajNależy zauważyć, że ponieważ oba
jobs
ikill
są wbudowanebash
, nie należy się żadne błędy na liście argumentów zbyt długo typu.źródło
zsh
dyskwalifikować ich jako jakiekolwiek autorytety w tej dziedzinie.kill %${(k)^jobdirs}
, jest rzeczywiście dłuższe; jeśli musisz podać PID, możesz użyć jeszcze dłuższego${${jobstates#*:*:}%%=*}
.>
Użyj
xargs
zamiast$(jobs -p)
podkomendy, ponieważ jeślijobs -p
jest pusta, polecenie zabicia zakończy się niepowodzeniem.źródło
jobs -p | xargs -rn10 kill
zrobi się lepiej, jeślijobs -p
nie zwróci żadnych PID. Zauważ, że-r
opcja to rozszerzenie GNU.-r
jest to krótki format--no-run-if-empty
rozszerzenia GNU,xargs
który nakazuje mu nie uruchamiać polecenia, jeśli stdin nie ma danych.Wolę sprawdzić, czy istnieją jakieś zadania przed ich zabiciem - w ten sposób skrypt nie zawiedzie, jeśli nic nie działa.
Jest także krótszy do pisania. Rzuć to w
.bash_profile
:Następnie uruchomić:
Aby zabić uruchomione zadania.
źródło
Mam kilka złożonych komend w tle, które chcę zakończyć z wdziękiem, wysyłając SIGINT do każdego procesu na macOS. Żadne z pozostałych rozwiązań nie działało poprawnie, więc wpadłem na to:
jobs -p
wyświetla procesy w tle uruchomione przez bieżącą powłokę.xargs -n1
wykonuje pkill raz dla każdego zadania.pkill -SIGINT -g
wysyła SIGINT (tak samo jak ctrl + c) do wszystkich procesów w grupie procesów.źródło
Myślę, że w zależności od tego, co
jobs -p
daje wynik , rozwiązanie może być nieco inne. W moim przypadkuDlatego wykonanie następujących czynności nie jest dobre.
Z drugiej strony, bieganie
kill $(jobs -p)
działa, ale pociąga za sobą wiele komunikatów o błędach, ponieważ przekazywanekill
są również ciągi inne niż PID .Dlatego moim rozwiązaniem jest
grep
najpierw PID, a następnie użyćxargs
w następujący sposób:źródło
echo $0
pokazuje Cohelp jobs
pokazuje Przedstawione dane wyjściowe nie są zgodne z POSIX ; każda implementacjajobs
powinna mieć-p
opcję z zamierzonym zachowaniem.jobs -p
wyprowadziłem tylko PID. Właśnie dowiedziałem się, że zsh nie jest całkowicie zgodny z POSIX.Wygląda na
jobs -p | xargs kill
to, że spełnia swoje zadanie, jednak generuje niechciane dane wyjściowe do zabicia. Tutaj grupuję dane wyjściowejobs -p
według / nie posiadających znaku + lub -A później możesz po prostu zadzwonić
killjobs
źródło