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

566
задан Orjanp 18 August 2010 в 09:44
поделиться

8 ответов

В 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 (потому что в них обоих спят , это не ракетостроение).

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

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

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

  • это на один процесс меньше, чем добавление | grep -v grep ; и
  • это элегантно и подлый, редкая комбинация: -)
1305
ответ дан 22 November 2019 в 22:02
поделиться

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

0
ответ дан 22 November 2019 в 22:02
поделиться

решение отфильтровало бы процессы с точным шаблоном, проанализировать pid, и создавать список аргументов для выполнения уничтожают процессы:

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

Объяснение от documenation:

утилита ps отображает строку заголовка, сопровождаемую строками, содержащими информацию обо всех Ваших процессах, которые имеют терминалы управления.

информация о Дисплее-e о процессах других пользователей, включая те

Дисплей-f uid, pid, порождают pid, недавнее использование ЦП, процесс запускаются

, утилита grep ищет любые данные входные файлы, выбирая строки, что

шаблон-e , - regexp=pattern Указывают шаблон, используемый во время поиска входа: входная строка выбрана, если она соответствует какому-либо из указанных шаблонов. Эта опция является самой полезной, когда несколько-e опций используются для определения нескольких шаблонов, или когда шаблон начинается с тире ('-').

xargs - создает список (списки) аргументов и выполняется, утилита

уничтожают - завершают или сигнализируют о процессе

, сигнал номер 9 - УНИЧТОЖАЕТ (non-catchable, неигнорируемое уничтожение)

Пример :

ps -ef  | grep -e node -e loggerUploadService.sh - -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9
0
ответ дан 22 November 2019 в 22:02
поделиться

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

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

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

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

5
ответ дан 22 November 2019 в 22:02
поделиться

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

pkill -f csp_build.py

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

128
ответ дан 22 November 2019 в 22:02
поделиться

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

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
14
ответ дан 22 November 2019 в 22:02
поделиться
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
3
ответ дан 22 November 2019 в 22:02
поделиться

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

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

Используя проверку равенства строк, я предотвращаю совпадение самого процесса.

3
ответ дан 22 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: