Найти и убить процесс в одной строке, используя 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
}
- 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
Метод, использующий только awk
(и ps
):
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}''
Это решает мои проблемы. Всегда будьте готовы перезапустить процесс, если вы случайно убили процесс.