Jak zabić ostatnie odrodzone zadanie w tle w systemie Linux?
Przykład:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Jak zabić ostatnie odrodzone zadanie w tle w systemie Linux?
Przykład:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Odpowiedzi:
W bash dostępna jest specjalna zmienna:
kill $!
$! rozwija się do PID ostatniego procesu wykonanego w tle.
^Z
nie wykonuje zadań w tle, zatrzymuje je. Następnie bg
wykonuje rzeczywiste „tło” (wznawia wykonywanie w tle), a następnie $!
działa zgodnie z oczekiwaniami.
????
stoi jeden lub więcej poleceń do wykonania po zabiciu, jeśli którekolwiek z tych poleceń zależy od pracy wykonanej przez proces w tle, pamiętaj o wszelkich zadaniach czyszczenia lub wykończenia, które proces w tle może wykonać w module obsługi sygnału po odbieranie (pułapkowego) sygnału. Najlepiej dodać wait
(po którym może być a, sync
a nawet a sleep <n>
) tuż przed pierwszą z takich komend „zależnych”.
Możesz zabić według numeru zadania. Po umieszczeniu zadania w tle zobaczysz coś takiego:
$ ./script &
[1] 35341
Jest [1]
to numer zadania i można się do niego odwoływać w następujący sposób:
$ kill %1
$ kill %% # Most recent background job
Aby wyświetlić listę numerów zadań, użyj jobs
polecenia. Więcej od man bash
:
Istnieje wiele sposobów odwoływania się do zadania w powłoce. Postać
%
wprowadza nazwę zadania. Numer zadanian
może być określany jako%n
. Zadanie może być również przywołane przy użyciu prefiksu nazwy użytej do jego uruchomienia lub przy użyciu podłańcucha, który pojawia się w jego wierszu poleceń. Na przykład%ce
odnosi się do zatrzymanegoce
zadania. Jeśli prefiks pasuje do więcej niż jednego zadania, bash zgłasza błąd.%?ce
Natomiast użycie odnosi się do każdego zadania zawierającego ciąg znakówce
w wierszu poleceń. Jeśli podłańcuch pasuje do więcej niż jednego zadania, bash zgłasza błąd. Symbole%%
i%+
odnoszą się do pojęcia powłoki bieżącego zadania, które jest ostatnim zadaniem zatrzymanym, gdy było na pierwszym planie lub rozpoczęło się w tle. Do poprzedniego zadania można się odwołać za pomocą%-
. W danych wyjściowych dotyczących zadań (np. Danych wyjściowych polecenia zadań) bieżące zadanie jest zawsze oznaczane za pomocą a+
, a poprzednie zadanie za pomocą-
. Pojedyncza%
(bez towarzyszącej specyfikacji pracy) odnosi się również do bieżącej pracy.
set -m
), jest on przeznaczony do użytku interaktywnego. Zobacz stackoverflow.com/questions/690266/... także
%1
i %%
- zwłaszcza. Niektóre rzeczy nie umierają na Ctrl-C, więc musisz je Ctrl-Z, a potem kill -9 %%
. Jednym z przykładów, w którym uznałem to za przydatne, jest: while true; do mplayer <some unstable online radio>; date >> restarts.log; done
- Ctrl-C poprowadzi cię do następnej iteracji w pętli. Zanim musiałem to zrobić, ps
a może jobs -l
, a następnie ponownie wpisać PID, co jest uciążliwe.
while true
z while sleep 1
. To da ci krótkie opóźnienie przed ponownym uruchomieniem, jeśli możesz z tym żyć, a jeśli naciśniesz ctrl-c dwa razy, drugi przerwie sen, kończąc go niezerowym wyjściem i wyjściem z pętli.
To powinno zabić wszystkie procesy w tle:
jobs -p | xargs kill -9
kill -9 %%
mniej pisze :)
jest to odpowiedź nie na temat, ale dla zainteresowanych może być cenna.
Jak w odpowiedzi @Johna Kugelmana,% jest związany ze specyfikacją zadania. jak skutecznie to znaleźć? użyj komendy less's i wzorca , wygląda na to, że mężczyzna używa mniej pagera (nie jestem tego pewien), w man bash wpisz &%, a następnie wpisz Enter pokaże tylko wiersze zawierające '%', aby ponownie wyświetlić wszystko, wpisz &. następnie Enter.
Wystarczy użyć polecenia killall:
killall nazwa zadania
Aby uzyskać więcej informacji i bardziej zaawansowane opcje, wpisz „man killall”.
killall python
lub killall java
mając coś pożytecznego w innym miejscu systemu.