Мне часто нужно убивать процесс во время программирования.
То, как я делаю это сейчас:
[~]$ 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>
Ответы:
В
bash
, вы должны быть в состоянии сделать:Подробности его работы следующие:
ps
дает вам список всех процессов.grep
фильтры , которые основаны на поисковой строке,[p]
это трюк , чтобы остановить вас собирание фактическогоgrep
самого процесса.awk
просто дает вам второе поле каждой строки, которое является PID.$(x)
средстве конструкта выполнитьx
затем принять свой вывод и положить его в командной строке. Вывод этогоps
конвейера внутри вышеупомянутой конструкции представляет собой список идентификаторов процессов, поэтому вы получите команду вродеkill 1234 1122 7654
.Вот расшифровка, показывающая это в действии:
и вы можете видеть, что это прекращает все шпалы.
Объясняя
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
; а такжеисточник
kill
будет работать со стандартным выводомkill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
grep '[p]ython csp_build.py'
вы также можете использовать:kill $(ps aux | grep 'python csp_build.py' | grep -v grep | awk '{print $2}')
.grep -v
возвращает несопоставленные строки.если у вас есть pkill,
Если вы хотите использовать только имя процесса (вместо полного списка аргументов), то не используйте
-f
.источник
pgrep
иpkill
работайте, пока вы заботитесь, чтобы правильно определить процесс. По умолчанию сопоставляется только имя процесса , которое в данном случае почти наверняка является просто «python». Используйте,pgrep -f "python csp_build.py"
чтобы соответствовать полной команде.pkill -9 -f csp_build.py
Один лайнер:
ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9
awk '{print $2}'
sudo
необязательноkill -9 5124
иkill -9 5373
т. Д. (Kill -15 более изящен, но немного медленнее)Бонус:
У меня также есть две функции быстрого доступа, определенные в моем .bash_profile (~ / .bash_profile для osx, вы должны увидеть, что работает на вашем * nix-компьютере).
p csp_build
иp python
т. д.bash_profile код:
ka csp_build
иka python
т. д.ka csp_build 15
,ka python 9
bash_profile код:
источник
source ~/.bash_profile
в текущей оболочке, чтобы импортировать новые функции (это то, что я предпочитаю).grep
. Помните, что все, что выглядит, какgrep x | awk '{ y }'
правило, лучше и часто болееawk '/x/ { y }'
Интерпретировать шаблон имени процесса как расширенное регулярное выражение.
источник
Попробуйте использовать
источник
ps aux | grep 'python csp_build.py' | awk '{print $2}' | xargs kill
работал на меня. спасибоgrep
, и большинство из них просто и элегантно. Тривиальный случайgrep x y | awk '{ z }'
всегда лучше написанawk '/x/ { z }' y
- см. Также бесполезное использованиеgrep
.Вы можете использовать только
pkill '^python*'
для регулярного уничтожения процесса.Если вы хотите увидеть, что вы собираетесь убить или найти перед тем, как убить, просто используйте
pgrep -l '^python*'
где -l выводит также имя процесса. Если вы не хотите использоватьpkill
, используйте просто:pgrep '^python*' | xargs kill
источник
Используйте pgrep - доступно на многих платформах:
pgrep -f вернет все PID с совпадением "cps_build"
источник
pgrep
, у вас также будетpkill
. Как всегда, не используйте,kill -9
если вы не знаете, почемуkill -15
(по умолчанию) илиkill -2
не будет работать.-9
и используется правильный современный синтаксис подстановки команд. Подтвердите это вместо этого; хотя, конечно,pkill
ответ еще лучше.-9
самом деле означает.Это вернет только PID
Итак, чтобы убить любой процесс в одну строку:
или, если вы знаете точное название процесса, вы также можете попробовать pidof:
Но, если вы не знаете точное название процесса,
pgrep
будет лучше.Если несколько процессов запущены с одним и тем же именем и вы хотите убить первый, то:
Также отметим, что если вас беспокоит чувствительность к регистру, вы можете добавить опцию -i, как в grep. Например:
Больше информации о сигналах и pgrep на
man 7 signal
илиman signal
иman pgrep
источник
Вы можете сделать это с помощью awk и backtics
$ 2 в awk печатает столбец 2, а backtics запускает напечатанный оператор.
Но гораздо более чистым решением было бы для процесса python сохранить его идентификатор процесса в / var / run, а затем вы можете просто прочитать этот файл и уничтожить его.
источник
Моей задачей было уничтожить все, что соответствует регулярному выражению, помещенному в конкретную директорию (после тестов на селен не все останавливалось). Это сработало для меня:
источник
-9
вариантkill
слишком агрессивен. Это не позволяет им освободить свои ресурсы.kill
принимает несколько процессов, поэтому цикл в основном бесполезен; и, как отмечено в другом месте на этой странице, вы не должны использовать,kill -9
если вы не знаете, что процесс не будет отвечать простоkill
.Чтобы убить процесс по ключевому слову
midori
, например:kill -SIGTERM $(pgrep -i midori)
источник
Метод, использующий только
awk
(иps
):Используя проверку на равенство строк, я предотвращаю сопоставление самого процесса.
источник
источник
ps
с-o
опцией.Дать -f pkill
Точный путь к файлу .py
источник
Я начал использовать что-то вроде этого:
источник
Убивать наши собственные процессы, запускаемые из общего PPID довольно часто, pkill, связанный с
–P
флагом, является для меня победителем. Используя пример @ ghostdog74:источник
Вам не нужен пользовательский переключатель для PS.
источник
В некоторых случаях я хотел бы уничтожить процессы одновременно следующим образом:
Но я думаю, что это немного неуместно в вашем случае (может быть, там работают python a, python b, python x ... на заднем плане).
источник
Если
pkill -f csp_build.py
не уничтожить процесс, вы можете добавить,-9
чтобы отправить сигнал уничтожения, который не будет проигнорирован. т.е.pkill -9 -f csp_build.py
источник
Решением будет фильтрация процессов с точным шаблоном, разбор pid и создание списка аргументов для выполнения процессов kill:
Пояснения из документации:
Пример :
источник
Я использую это, чтобы убить Firefox, когда его сценарий захлопывается и процессор избивает :) Замените «Firefox» на приложение, которое вы хотите умереть. Я использую оболочку Bash - OS X 10.9.3 Darwin.
kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)
источник
grep Firefox | awk 'NR == 1 { next } ...'
сawk 'NR == 1 || $11 !~ /Firefox/ { next } ...'
не только экономит процесс, но и повышает точность. Это не трудно избавитьсяsort | uniq
в чистом Awk либо ( в то время, конечно ,uniq | sort
это просто неправильно - это будет не хватать каких - либо дубликаты , которые не являются смежными, и скрыть ошибку, без необходимости сортировки выход изuniq
).Я использую
gkill processname
, где gkill это следующий скрипт:ПРИМЕЧАНИЕ: это НЕ убьет процессы, которые имеют "grep" в своих командных строках.
источник
grep
и другими распространенными антипаттернами сценариев оболочки.Следующая команда пригодится:
kill $(ps -elf | grep <process_regex>| awk {'print $4'})
например.,
ps -elf | grep top
kill -$(ps -elf | grep top| awk {'print $4'})
Если процесс все еще застрял, используйте расширение -9 для hardkill, как показано ниже:
kill -9 $(ps -elf | grep top| awk {'print $4'})
Надеюсь, это поможет...!
источник
Найти и убить все процессы в одной строке в bash.
ps -ef | grep '<exe_name>'
- Предоставляет список деталей запущенного процесса (uname, pid и т. Д.), Который соответствует шаблону. Выходной список включает в себя и этуgrep
команду, которая ищет ее. Теперь для убийства нам нужно игнорировать этотgrep
командный процесс.ps -ef | grep '<exec_name>' | grep -v 'grep'
- Добавление еще одного grep с-v 'grep'
удаляет текущий процесс grep.awk
get get id процесса.$(...)
и передайте ееkill
команде, чтобы убить весь процесс.источник
Вы можете использовать приведенную ниже команду для вывода списка команд. Используйте top или лучше используйте htop для просмотра всех процессов в linux. Здесь я хочу убить процесс с именем
И проверь пид. Это должно быть правильно. Чтобы убить их, используйте команду kill.
Например: - из списка процессов htop.
Это решает мои проблемы. Всегда будьте готовы перезапустить процесс, если вы случайно убили процесс.
источник