2009-10-22 10 views
7

działa to, ale zabija każdy proces Pythona.Zabij proces używając nazwy wewnątrz linux (Python)

pkill python 

Jednak nie mogę zrobić:

pkill myscript.py 

Próbowałem również killall, ale bez powodzenia albo. Czy muszę używać wyrażeń regularnych?

Nawiasem mówiąc, chcę to zrobić w skrypcie python z zaimportować os.

Odpowiedz

5

Czy uruchomiłeś podproces w Pythonie z tego samego skryptu, z którego go zabijasz? Jeśli tak, zobacz szczegóły: this question. Jeśli nie, możesz użyć opcji -f w celu wyszukania nazwy skryptu na liście argumentów procesu Python, ale nadal możesz ryzykować zabicie czegoś, czego nie chcesz. Aby uzyskać więcej informacji, patrz man page.

0

musisz sprawdzić identyfikator procesu (pid). Możesz użyć polecenia "ps -A | grep NAME", a następnie zastosować "kill -9 PID". Te polecenia można z łatwością przetłumaczyć na Pythona.

Próba użycia "nazwy" (jak w pkill) może dać wiele dopasowań, a tym samym nieoczekiwane wyniki (przynajmniej w kontekście określonym powyżej w pytaniu).

+0

jak to, że różni się od 'pkill'? – hasen

+0

Nie musisz używać pid. Możesz użyć dowolnego sposobu identyfikacji procesu, który twój procesor zabójca pozwala ci użyć. Wszystkie * nix używają pid wewnętrznie, ale czasami ludzie chcą zabić wszystkie procesy pasujące do wzorca, a nie tylko konkretnego pid. –

+0

... ale ostatecznie dostajesz się do pid: jak wspomniałem powyżej, ktoś ma więcej zmian, aby zabić niezamierzony proces, przechodząc przez inne sposoby. Byłem tam. – jldupont

2

Czy proces jest w stanie zapisać plik pid?
W Pythonie masz PID tak:

import os 
os.getpid() 

Killing nazwy jest wygodne, ale czasami ma niepożądane skutki, jak widzieliście.

+1

Myślę, że próbuje zabić określony skrypt Pythona z (zwykłej) linii komend, a nie zrobić coś z pythona – hasen

+0

dotyczy obu. Chciałbym użyć pkill myscript.py ... po prostu nauczyć się, jak to zrobić w linii poleceń – TIMEX

+1

@hasen, nadal jest łatwiej, jeśli masz plik pid, "zabij" kota pid'' za pomocą backticks zamiast '' ' –

-1

Spróbuj tego:

echo '#!/usr/bin/env python' > myscript 
cat myscript.py >>myscript 
chmod +x myscript 
./myscript 

Oczywiście trzeba będzie zmienić kod aby zabić proces o nazwie „myscript” w systemach UNIX, plik wykonywalny zawiera kilka bajtów na początku którego powiedzieć OS jaki format binarny jest używany. Jeśli pierwsze dwa bajty to #!, system operacyjny zakłada, że ​​jest to plik tekstowy, który może zostać wykonany przez inny program, a system operacyjny ładuje inny program i przekazuje mu plik tekstowy.

W tym przypadku prawdopodobnie mógłbym napisać #!/usr/bin/python w górnej linii, ale jeśli twój pyton jest w /usr/local/bin, to nie zadziałałoby. Zamiast tego używam env, aby zmusić go do przeszukiwania normalnej ścieżki dla Pythona. Wszystkie systemy UNIX mają env w katalogu/usr/bin. Aby uzyskać więcej informacji, wpisz man env.

2

sudo kill -9 `pgrep python`

To polecenie zabić wszystkich procesów uruchomionych python

Powiązane problemy