Jak zakończyć proces w tle?


195

Uruchomiłem wget na zdalnej maszynie w tle za pomocą &. Nagle przestaje się pobierać. Chcę zakończyć proces, a następnie ponownie uruchomić polecenie. Jak mogę to zakończyć?

Nie zamknąłem jego okna powłoki. Ale jak wiesz, nie przestaje używać Ctrl+ Ci Ctrl+ Z.

Odpowiedzi:


255

Jest na to wiele sposobów.

Metoda nr 1 - ps

Możesz użyć pspolecenia, aby znaleźć identyfikator procesu dla tego procesu, a następnie użyć PID, aby zabić proces.

Przykład

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

Metoda nr 2 - pgrep

Możesz również znaleźć identyfikator procesu za pomocą pgrep.

Przykład

$ pgrep wget
1234

$ kill 1234

Metoda nr 3 - zabij

Jeśli masz pewność, że to jedyne wgeturuchomione narzędzie, możesz użyć polecenia, pkillaby zabić zlecenie według nazwy.

Przykład

$ pkill wget

Metoda nr 4 - zadania

Jeśli znajdujesz się w tej samej powłoce, z której wykonałeś zadanie w tle. Możesz sprawdzić, czy nadal działa, używając jobspolecenia, a także zabić go według numeru zadania.

Przykład

Mój fałszywy praca, sleep.

$ sleep 100 &
[1] 4542

Znajdź numer pracy. UWAGA: liczba 4542 jest identyfikatorem procesu.

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

Metoda nr 5 - rys

Za pomocą fgpolecenia możesz przenieść zadanie w tle z powrotem na pierwszy plan .

Przykład

Fałszywe praca, sleep.

$ sleep 100 &
[1] 4650

Uzyskaj numer pracy.

$ jobs
[1]+  Running                 sleep 100 &

Przenieś zadanie nr 1 z powrotem na pierwszy plan, a następnie użyj Ctrl+ C.

$ fg 1
sleep 100
^C
$

jobsNie ma outputi fg NOK: -bash: fg: 1: no such job. Ale pisanie fgdziała dobrze, a także pkill wgetdziała dobrze. ale ps -eaf|grep wgeti wtedy kill <process number>dawka nie zatrzyma pracy. ps: używam trzeciej liczby jako numeru procesu .
Mohammad Etemaddar,

1
@MohammadEtemaddar - użyj drugiej liczby z wyjścia ps. 3rd # to identyfikator procesu rodzica.
slm

1
@MohammadEtemaddar - ah, ps znajduje grep. Czy to tak: ps -eaef| grep [w]get.
slm

1
@MohammadEtemaddar - możesz także użyć pgrepzamiast tego pgrep wget.
slm

2
@MohammadEtemaddar - przepraszam, że dodatkowe e to literówka. Powinien przeczytać ps -eaf | grep [w]get. Opcje znajdują się na psstronie man. man ps.
slm

70

W bash możesz użyć, fgaby przenieść pracę na pierwszy plan, a następnie użyć Ctrl+C

Lub wypisz proces w tle za pomocą, jobsa następnie wykonaj

kill %1

(z 1 zastąpionym przez numer, jobsktóry ci dał)


13

Możesz również użyć kill $!do zabicia ostatniego zadania w tle.


Jeśli jest używany jako polecenie jak alias w profilu bash, pamiętaj o umieszczeniu pojedynczych cudzysłowów.
Nate Ritter

6

EDYCJA: Na pierwszym planie możesz Ctrl+ Club, jak wspomina @Zelda, zabić za pomocą „% x”, gdzie „x” to numer zadania, który wyśle ​​sygnał domyślny (najprawdopodobniej SIGTERM w przypadku Linuksa).

po prostu wpisz, fgaby przenieść go na pierwszy plan, jeśli był to ostatni proces w tle (za pomocą „&”).

Jeśli nie był to ostatni, wpisz: jobsi znajdź „numer zadania” przedstawiony w „[]”. Następnie wpisz:

fg 2

.. gdzie „2” to numer zadania, na przykład:

foo@bar:~/junk/books$ jobs
[1]+  Running                 okular how_to_cook_a_turkey.pdf &
foo@bar:~/junk/books$ fg 1
okular how_to_cook_a_turkey.pdf            <- this is now in the foreground.

4

Prawidłowym sposobem jest wpisanie, jobsa następnie użycie numeru zadania, aby go zabić. Aby użyć pid do zabicia go, musisz przenieść go na pierwszy plan, jak zauważono w pierwszej odpowiedzi.

Spróbuj tego

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

Jeśli uruchamiasz zadania zaraz po ich zabiciu, powinieneś to zobaczyć

Desktop$ jobs
[1]+  Terminated              sleep 1000

4

Jedną rzeczą, której tu nie widzę, która okazała się bardzo przydatna, szczególnie podczas testowania poleceń, jest pidof. Możesz użyć, pidof [command]aby znaleźć identyfikator procesu, który jest aktualnie uruchomiony. Podoba mi się, ponieważ pozwala mi szybko znaleźć identyfikator żądanego polecenia, które zwykle jest właśnie wywoływane.

Po otrzymaniu pid możesz po prostu zabić proces. Pozwala na tworzenie prostych skryptów do zabijania procesu tylko wtedy, gdy jest on aktualnie uruchomiony.


1
Ach, to mi pomogło! kill% 1 z jakiegoś powodu nie działało, „kill: nie można przeanalizować argumentu: '% 1'” i Ctrl + C nie działał; Nie znaleźliśmy proces w ps lub czegokolwiek, ponieważ był root (zapomniałem użyłem sudo z nim)
mjohnsonengr

1

Typowym przykładem jest stressnarzędzie. Powiedzmy, że wykonałeś następujące czynności:

$ stress -c 4 -m 4 

i zamknął okno terminala. Proces będzie kontynuował jedzenie twoich zasobów z tła.

Oto, co robię:

$ x=`pgrep stress` ; sudo kill -9 $x 

pgrepwyszczególnia PID poddanego procesu i zapisuje go w zmiennej, xktóra następnie używana jest kill -9do jego zakończenia.


0

w ostatnim zatrzymanym procesie bash (Ctrl-Z) zabijesz:

kill %%
kill -9 %%

lub jeśli chcesz wybrać, użyj:

jobs

następnie:

kill %N

lubić kill %2

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.