Найти и убить процесс в одной строке, используя bash и regex

Мне часто нужно убивать процесс во время программирования.

Теперь я делаю это:

[~]$ 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

Как я могу извлечь идентификатор процесса автоматически и убить его в одной строке?

Вот так:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>

Ответ 1

В bash вы сможете:

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

Подробная информация о его работе выглядит следующим образом:

  • ps предоставляет вам список всех процессов.
  • Фильтры grep, основанные на вашей строке поиска, [p] - это трюк, чтобы остановить процесс фактического grep.
  • awk просто дает вам второе поле каждой строки, которое является PID.
  • Конструкция $(x) означает выполнение x, затем вывести ее и поместить в командную строку. Результатом этого конвейера ps внутри этой конструкции является список идентификаторов процессов, поэтому вы получите команду типа kill 1234 1122 7654.

Здесь транскрипт, показывающий его в действии:

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

и вы можете увидеть, как он заканчивает все шпалы.


Объяснение бит grep '[p]ython csp_build.py' более подробно:

Когда вы выполняете sleep 3600 &, за которым следует ps -ef | grep sleep, вы получаете два процесса с sleep в нем: sleep 3600 и grep sleep (поскольку оба они имеют sleep в них, это не ракетостроение).

Однако ps -ef | grep '[s]leep' не создаст процесс с sleep в нем, вместо этого создаст grep '[s]leep', а вот сложный бит: grep не найдет его, потому что ищет регулярное выражение " любой символ из класса символов [s] (который равен s), за которым следует leep.

Другими словами, он ищет sleep, но процесс grep grep '[s]leep', который не имеет в нем sleep.

Когда мне было показано это (кем-то здесь, на SO), я сразу начал использовать его, потому что

  • это еще один процесс, чем добавление | grep -v grep; и
  • он элегантный и подлый, редкая комбинация: -)

Ответ 2

если у вас есть pkill,

pkill -f csp_build.py

Если вы хотите только grep против имени процесса (вместо полного списка аргументов), оставьте -f.

Ответ 3

Один вкладыш:

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

  • Распечатайте столбец 2: awk '{print $2}'
  • sudo является необязательным
  • Запустите kill -9 5124, kill -9 5373 и т.д. (kill -15 более изящный, но немного медленнее)

Бонус:

У меня также есть две функции быстрого доступа, определенные в моем .bash_profile (~/.bash_profile для osx, вы должны увидеть, что работает для вашей машины * nix).

  • p
    • перечисляет все P rocesses, содержащие ключевое слово
    • использование: p csp_build, p python и т.д.

Код bash_profile:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. ka
    • < ll процессы, которые имеют это ключевое слово
    • использование, например: ka csp_build, ka python и т.д.
    • дополнительный уровень убийства, например: ka csp_build 15, ka python 9

Код bash_profile:

# 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"
}

Ответ 4

Попробуйте использовать

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill

Ответ 5

killall -r regexp

-r, --regexp

Интерпретировать шаблон имени процесса как расширенное регулярное выражение.

Ответ 6

Вы можете использовать только pkill '^python*' для убийства процесса regex.

Если вы хотите увидеть, что вы собираетесь убить или найти до убийства, просто используйте pgrep -l '^python*', где -l выдает также имя процесса. Если вы не хотите использовать pkill, используйте только:

pgrep '^python*' | xargs kill

Ответ 7

Использовать pgrep - доступно на многих платформах:

kill -9 `pgrep -f cps_build`

pgrep -f вернет все PID с совпадением "cps_build"

Ответ 8

вы можете сделать это с помощью awk и backtics

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

$2 в awk печатает столбец 2, а backtics запускает напечатанное выражение.

Но гораздо более чистым решением было бы для процесса python хранить его идентификатор процесса в /var/run, а затем вы можете просто прочитать этот файл и убить его.

Ответ 9

Моей задачей было уничтожить все, что соответствует регулярному выражению, помещенному в конкретную директорию (после тестов на селен не все останавливалось). Это сработало для меня:

for i in 'ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq'; do kill $i; done

Ответ 10

Чтобы убить процесс по ключевому слову midori, например:

kill -SIGTERM $(pgrep -i midori)

Ответ 11

Это вернет только pid

pgrep -f 'process_name'

Итак, чтобы убить любой процесс в одну строку:

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

или, если вы знаете точное название процесса, вы также можете попробовать pidof:

kill -9 $(pidof 'process_name')

Но если вы не знаете точного названия процесса, pgrep будет лучше.

Если несколько процессов запущены с одним и тем же именем и вы хотите убить первый, то:

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

Также отметим, что если вас беспокоит чувствительность к регистру, вы можете добавить опцию -i, как в grep. Например:

kill -9 $(pgrep -fi chrome)

Больше информации о сигналах и pgrep в man 7 signal или man signal и man pgrep

Ответ 12

Метод, использующий только awkps):

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

При использовании тестирования равенства строк я не могу совместить этот процесс.

Ответ 13

ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15

Ответ 14

Дайте -f для pkill

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

точный путь файла .py

# ps ax | grep fritzcap.py
 3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m

Ответ 15

Я начал использовать что-то вроде этого:

kill $(pgrep 'python csp_build.py')

Ответ 16

Убить наши собственные процессы, запущенные из обычного PPID, довольно часто, pkill, связанный с флагом –P, является для меня победителем. Пример @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

Ответ 17

Вам не нужен пользовательский переключатель для ps.

kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`

Ответ 18

В некоторых случаях я хотел бы убивать процессы одновременно так:

➜  ~  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

Но, я думаю, это немного неуместно в вашем случае. (Возможно, в фоновом режиме запущены python a, python b, python x...)

Ответ 19

Я использую это, чтобы убить Firefox, когда он script захлопнулся и cpu bashing:) Замените "Firefox" на приложение, которое хотите умереть. Я нахожусь в оболочке Bash - OS X 10.9.3 Darwin.

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

Ответ 20

Я использую gkill processname, где gkill - это script:

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

ПРИМЕЧАНИЕ: он не будет убивать процессы, которые имеют "grep" в их командных строках.

Ответ 21

Если pkill -f csp_build.py не завершает процесс, вы можете добавить -9 для отправки сигнала об уничтожении, который не будет проигнорирован. то есть pkill -9 -f csp_build.py

Ответ 22

Пригодится следующая команда:

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

например., 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

Если процесс все еще застрял, используйте расширение "-9" для hardkill, как показано ниже:

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

Надеюсь, что поможет...!

Ответ 23

Найти и убить все процессы в одной строке в bash.

kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
  • ps -ef | grep '<exe_name>' ps -ef | grep '<exe_name>' - ps -ef | grep '<exe_name>' список запущенных деталей процесса (uname, pid и т.д.), который соответствует шаблону. Список вывода также включает эту команду grep которая ищет ее. Теперь для убийства нам нужно игнорировать этот процесс команды grep.
  • ps -ef | grep '<exec_name>' | grep -v 'grep' ps -ef | grep '<exec_name>' | grep -v 'grep' - Добавление еще одного grep с -v 'grep' удаляет текущий процесс grep.
  • Затем с помощью awk получите идентификатор процесса в одиночку.
  • Затем сохраните эту команду внутри $(...) и передайте ее команде kill, чтобы уничтожить весь процесс.

Ответ 24

Вы можете использовать приведенную ниже команду для вывода списка команд. Используйте top или лучше используйте htop для просмотра всех процессов в linux. Здесь я хочу убить процесс с именем

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

И проверь пид. Это должно быть правильно. Чтобы убить их, используйте команду kill.

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

Например: - из списка процессов htop.

sudo kill -9 'ps -ef | grep '<process>'  | grep -v grep | awk '{print $2}''

Это решает мои проблемы. Всегда будьте готовы перезапустить процесс, если вы случайно убили процесс.