В 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
; и Если pkill -f csp_build.py
не уничтожает процесс, можно добавить -9
для отправки сигнала уничтожения, который не будет проигнорирован. т.е. pkill -9 -f csp_build.py
решение отфильтровало бы процессы с точным шаблоном, проанализировать 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
вы можете сделать это с помощью awk и backtics
ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`
$ 2 в awk печатает столбец 2, а backtics запускает напечатанный оператор.
Но гораздо более чистым решением было бы, если бы процесс python сохранил свой идентификатор процесса в / var / run, а затем вы могли бы просто прочитать этот файл и убить его.
, если у вас есть pkill,
pkill -f csp_build.py
Если вы хотите использовать grep только против имени процесса (а не полного списка аргументов), то оставьте -f
.
Попробуйте использовать
ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
Метод, использующий только awk
(и ps
):
ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'
Используя проверку равенства строк, я предотвращаю совпадение самого процесса.