Znajdź i zabij proces w jednej linii za pomocą bash i regex

Często muszę zabić proces podczas programowania.

Teraz robię to tak:

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124

Jak wyodrębnić identyfikator procesu automatycznie i zabić go w tej samej linii?

TAK:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
Author: Orjanp, 2010-08-18

26 answers

W bash, powinieneś być w stanie zrobić:

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

Szczegóły jego działania są następujące:

  • ps daje listę wszystkich procesów.
  • filtry grep, które na podstawie szukanego ciągu, [p] to sztuczka, która powstrzyma cię od pobierania samego procesu grep.
  • awk daje po prostu drugie pole każdej linii, które jest PID.
  • $(x) construct oznacza wykonanie x następnie pobranie jego wyjścia i umieszczenie go na wiersz poleceń. Wyjście ps potoku wewnątrz powyższej konstrukcji jest listą identyfikatorów procesów, więc kończysz z poleceniem podobnym do kill 1234 1122 7654.

Oto transkrypcja pokazująca to w akcji:

pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+  Terminated              sleep 3600
[1]   Terminated              sleep 3600
[2]   Terminated              sleep 3600
[3]-  Terminated              sleep 3600
[4]+  Terminated              sleep 3600
/ Align = "left" /

Wyjaśnienie grep '[p]ython csp_build.py' nieco bardziej szczegółowo:

Kiedy wykonujesz sleep 3600 &, po którym następuje ps -ef | grep sleep, zazwyczaj otrzymujesz dwa procesy z sleep w nim, sleep 3600 i grep sleep (ponieważ oba mają sleep w nich, to nie jest rocket science).

Jednak ps -ef | grep '[s]leep' nie utworzy procesu z sleep, zamiast tego utworzy grep '[s]leep' i oto skomplikowany bit: grep nie znajdzie go, ponieważ szuka wyrażenia regularnego " dowolny znak z klasy znaków [s] (która jest s), po którym następuje leep.

Innymi słowy, szuka sleep, ale proces grep jest grep '[s]leep', który nie ma sleep w nim.

Kiedy pokazano mi to (przez ktoś tutaj na SO), od razu zacząłem go używać, ponieważ]}

  • jest o jeden proces mniej niż dodawanie | grep -v grep; i
  • to eleganckie i podstępne, rzadkie połączenie: -)
 1496
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-15 12:38:56

Jeśli masz pkill,

pkill -f csp_build.py

Jeśli chcesz używać grep tylko przeciwko nazwie procesu (zamiast pełnej listy argumentów), zostaw -f.

 156
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-02 20:40:41

Jedna linijka:

ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9

  • Wydrukuj kolumnę 2: awk '{print $2}'
  • sudo jest opcjonalne
  • Run kill -9 5124, kill -9 5373 w tym samym czasie kill -15 jest bardziej wdzięczny, ale nieco wolniejszy.]}

Bonus:

Mam również 2 funkcje skrótu zdefiniowane w moim .bash_profile (~/.bash_profile jest dla osx, musisz zobaczyć, co działa na twoim komputerze * nix).

  1. p słowo kluczowe
    • wypisuje wszystkie P rokosze zawierające słowo kluczowe
    • użycie np.: p csp_build , p python etc

bash_profile code:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. ka słowo kluczowe
    • K ills A ll procesy, które mają to słowo kluczowe
    • użycie np.: ka csp_build , ka python etc
    • opcjonalny poziom zabijania np.: ka csp_build 15, ka python 9

bash_profile code:

# KILL ALL
function ka(){

    cnt=$( p $1 | wc -l)  # total count of processes found
    klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty

    echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
    p $1

    echo -e '\nTerminating' $cnt 'processes .. '

    ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
    echo -e "Done!\n"

    echo "Running search again:"
    p "$1"
    echo -e "\n"
}
 99
Author: a20,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-08 08:56:00
killall -r regexp

-r, --regexp

Interpretuje wzorzec nazwy procesu jako rozszerzone Wyrażenie regularne.

 18
Author: Miron Yanovskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-28 11:56:13

Spróbuj użyć

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
 16
Author: Rahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-25 10:48:23

Możesz używać tylko pkill '^python*' do zabijania procesów regex.

Jeśli chcesz zobaczyć, co chcesz zabić lub znaleźć przed zabiciem, użyj pgrep -l '^python*' Gdzie-l wyświetla również nazwę procesu. Jeśli nie chcesz używać pkill, Użyj tylko:

pgrep '^python*' | xargs kill

 12
Author: NGix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-20 11:38:27

Zwróci tylko pid

pgrep -f 'process_name'

Więc aby zabić dowolny proces w jednej linii:

kill -9 $(pgrep -f 'process_name')

Lub, jeśli znasz dokładną nazwę procesu, możesz również spróbować pidof:

kill -9 $(pidof 'process_name')

Ale jeśli nie znasz dokładnej nazwy procesu, pgrep byłoby lepiej.

Jeśli istnieje wiele procesów o tej samej nazwie i chcesz zabić pierwszy, to:

kill -9 $(pgrep -f 'process_name' | head -1)

Należy również zauważyć, że jeśli martwisz się o wrażliwość na wielkość liter, możesz dodać opcję-i tak jak w grep. Na przykład:

kill -9 $(pgrep -fi chrome)

Więcej informacji o sygnałach i pgrep na man 7 signal lub man signal i man pgrep

 10
Author: Rakib Fiha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-30 08:02:40

Użyj pgrep-dostępnego na wielu platformach:

kill -9 `pgrep -f cps_build`

Pgrep-f zwróci wszystkie PID ze zbiegiem okoliczności "cps_build"

 8
Author: vr286,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-22 16:31:03

Możesz to zrobić z awk i backtics

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`

$2 w awk wyświetla kolumnę 2, a backtics uruchamia instrukcję, która została wydrukowana.

Ale o wiele czystszym rozwiązaniem byłoby, gdyby proces Pythona przechowywał swój identyfikator procesu w /var / run, a następnie można go po prostu odczytać i zabić.

 5
Author: Alexander Kjäll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 09:42:34

Moim zadaniem było zabicie wszystkiego pasującego do wyrażenia regularnego, które jest umieszczone w konkretnym katalogu (po testach selenium nie wszystko zostało zatrzymane). To mi się udało:

for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done
 5
Author: Serge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-15 15:46:17

Aby zabić proces za pomocą słowa kluczowego midori, Na przykład:

kill -SIGTERM $(pgrep -i midori)

 5
Author: l3v1ath4n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-27 15:44:55
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
 4
Author: Vijay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 10:20:18

Metoda wykorzystująca tylko awk (i ps):

ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'

Za pomocą string equality testing zapobiegam dopasowaniu tego procesu.

 3
Author: schot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 10:06:04

Give-f to pkill

pkill -f /usr/local/bin/fritzcap.py

Dokładna ścieżka pliku. py to

# ps ax | grep fritzcap.py
 3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m
 3
Author: Robert1968,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-13 09:48:10

Rozwiązanie byłoby filtrowaniem procesów za pomocą dokładnego wzorca , analizowaniem pid i konstruowaniem listy argumentów do wykonywania procesów kill:

ps -ef  | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9

Wyjaśnienie z dokumentu:

Ps narzędzie wyświetla linię nagłówka, a następnie linie zawierające informacje o wszystkich procesach, które mają terminale sterujące.

-e Wyświetlanie informacji o procesach innych użytkowników, w tym tych

-f wyświetla uid, pid, PID nadrzędny, Ostatnie użycie procesora, start procesu

Narzędzie grep przeszukuje wszystkie podane pliki wejściowe, wybierając linie, które

-e pattern, --regexp = pattern Określ wzorzec używany podczas wyszukiwania wejścia: Wejście linia jest zaznaczona, jeśli pasuje do któregokolwiek z podanych wzorców. Ta opcja jest najbardziej przydatna, gdy wiele opcji-e jest używanych do określić wiele wzorów lub gdy wzór zaczyna się myślnikiem (`-').

Xargs - konstruuj listę argumentów i wykonuj narzędzie

Kill - zakończenie lub sygnał procesu

Liczba 9 signal-KILL (nie-catchable, nie-ignorable kill)

Przykład :

ps -ef  | grep -e node -e loggerUploadService.sh - -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9
 3
Author: avivamg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-12 10:44:16

Zacząłem używać czegoś takiego:

kill $(pgrep 'python csp_build.py')
 2
Author: Nathanael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-10 19:05:29

Kill our own processes started from a common PPID is questly, pkill associated to the –P flag is a winner for me. Przykład @ghostdog74:

# sleep 30 &                                                                                                      
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$                                                                                                         
[1]   Terminated              sleep 30
[2]   Terminated              sleep 30
[3]-  Terminated              sleep 30
[4]+  Terminated              sleep 30
 1
Author: Juan Diego Godoy Robles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 06:17:01

Nie potrzebujesz przełącznika użytkownika dla ps.

kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`
 1
Author: Alex V,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-10 18:42:28

W niektórych przypadkach chciałbym zabić procesy simutaneously w ten sposób:

➜  ~  sleep 1000 &
[1] 25410
➜  ~  sleep 1000 &
[2] 25415
➜  ~  sleep 1000 &
[3] 25421
➜  ~  pidof sleep
25421 25415 25410
➜  ~  kill `pidof sleep`
[2]  - 25415 terminated  sleep 1000                                                             
[1]  - 25410 terminated  sleep 1000
[3]  + 25421 terminated  sleep 1000
Ale myślę, że to trochę niestosowne w Twoim przypadku.(Może być uruchomiony python a, python b, python x...in tło.)
 1
Author: kashu.org,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-24 03:16:58

Jeśli pkill -f csp_build.py nie zabije procesu, możesz dodać -9, Aby wysłać sygnał kill, który nie będzie ignorowany. tj. pkill -9 -f csp_build.py

 1
Author: yosemite_k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-17 15:03:14

Używam tego do zabicia Firefoksa, gdy jest on trzaskany skryptem i atakowany cpu :) Zamień "Firefox" na aplikację, którą chcesz umrzeć. Jestem na powłoce Bash-OS X 10.9.3.

kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)

 0
Author: mrhassell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-11 22:34:13

Używam gkill processname, Gdzie gkill jest następującym skryptem:

cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
    echo "Found $cnt processes - killing them"
    ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
    echo "No processes found"
fi

Uwaga: nie zabije procesów, które mają "grep" w swoich wierszach poleceń.

 0
Author: Kostyantyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-07 23:42:28

Użycie flagi -C z polecenia ps

-C cmdlist
     Select by command name.  This selects the processes whose
     executable name is given in cmdlist.

Pierwszy przypadek, polecenie proste

Więc jeśli uruchomisz swój skrypt przez standardowy shebang i wywołasz je po jego imieniu:

/path/to/csp_build.py

You may find them whith

ps -C csp_build.py

Więc

kill $(ps -C csp_build.py ho pid)
Może wystarczy.

Druga sprawa, Szukaj cmd

Trochę silniejszy, ale i tak dużo szybszy niż większość innych odpowiedzi na to pytanie...

If you don ' t know ho this is run, or if you run them by

python csp_build.py
python3 csp_build.py
python /path/to/csp_build.py

Możesz je znaleźć po uruchomieniu:

ps -C python,python3,csp_build.py who pid,cmd | grep csp_build.py

Następnie używając sed:

kill $(ps -C python,python3,csp_build.py who pid,cmd |
    sed -ne '/csp_build.py/s/^ *\([0-9]\+\) .*$/\1/p')
 0
Author: F. Hauri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-10 09:00:22

Przyda się następujące polecenie:

kill $(ps -elf | grep <process_regex>| awk {'print $4'})

Np., ps -elf | grep top

    0 T ubuntu    6558  6535  0  80   0 -  4001 signal 11:32 pts/1    00:00:00 top
    0 S ubuntu    6562  6535  0  80   0 -  2939 pipe_w 11:33 pts/1    00:00:00 grep --color=auto top

kill -$(ps -elf | grep top| awk {'print $4'})

    -bash: kill: (6572) - No such process
    [1]+  Killed                  top

Jeśli proces nadal jest zablokowany, użyj rozszerzenia" -9 " do hardkill, w następujący sposób:

kill -9 $(ps -elf | grep top| awk {'print $4'})

Mam nadzieję, że to pomoże...!
 -1
Author: Akshay Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-08 06:18:37

Znajdź i zabij wszystkie procesy w jednej linii w bash.

kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
  • ps -ef | grep '<exe_name>' - Wyświetla listę uruchomionych procesów (uname, pid, itd.), które pasują do wzorca. Lista wyjściowa zawiera również polecenie grep, które je przeszukuje. Teraz dla zabijania musimy zignorować ten grep proces dowodzenia.
  • ps -ef | grep '<exec_name>' | grep -v 'grep' - dodanie kolejnego grepa za pomocą -v 'grep' usuwa bieżący proces grepa.
  • następnie używając awk uzyskaj sam identyfikator procesu.
  • następnie zachowaj to polecenie w środku $(...) i przekazać do kill komendy, aby zabić cały proces.
 -1
Author: rashok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 06:47:48

Możesz użyć poniższego polecenia, aby wyświetlić listę pid polecenia. Użyj top lub lepiej Użyj htop, aby wyświetlić wszystkie procesy w Linuksie. Tutaj chcę zabić proces o nazwie

ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'

I zweryfikować pid. To musi być proper.To zabij ich za pomocą polecenia Zabij.

sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'`

NP: - jest z listy procesów htop.

sudo kill -9 `ps -ef | grep '<process>'  | grep -v grep | awk '{print $2}'`
To rozwiązuje moje problemy. Zawsze bądź przygotowany na ponowne uruchomienie procesu, jeśli przypadkowo go zabijesz.
 -1
Author: shijin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-28 15:08:59