Как убить процесс по имени вместо PID в Linux?
Проблема с завершением процесса Firefox
Когда я пытаюсь запустить Firefox, он выдает сообщение "Процесс Firefox уже запущен". В таких случаях мне приходится вручную искать и убивать этот процесс. Для этого я использую следующие команды:
jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy 7451 25.0 27.4 170536 65680 ? Sl 22:39 1:18 /usr/lib/firefox-3.0.1/firefox
jeremy 7578 0.0 0.3 3004 768 pts/0 S+ 22:44 0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451
Меня бы устроила команда, которая могла бы выполнять все эти действия автоматически. Она должна принимать строку с именем процесса (например, "firefox"), искать его в списке процессов и убивать все найденные процессы.
Я пытался реализовать это на PHP с помощью функции exec('ps aux')
, но она, похоже, показывает только процессы, которые были запущены с помощью exec()
в самом скрипте PHP (в результате я вижу только сам процесс PHP).
Есть ли возможность создать такую команду в Bash или PHP, которая бы автоматизировала этот процесс?
5 ответ(ов)
Команда pkill firefox
используется в Unix-подобных операционных системах для завершения всех процессов, связанных с приложением Firefox. Эта команда посылает сигнал завершения (по умолчанию SIGTERM) всем процессам, имя которых совпадает с "firefox".
Если вы хотите использовать pkill
, убедитесь, что у вас есть соответствующие права для завершения процессов. В случае, если вам необходимо завершить процесс с помощью другой команды, например, kill
или killall
, вы можете использовать их, указав идентификатор процесса или полное имя приложения.
Дополнительную информацию о pkill
можно найти по следующей ссылке: http://linux.about.com/library/cmd/blcmdl1_pkill.htm.
Также возможно использовать:
pkill -f "Имя процесса"
У меня это сработало идеально. Именно то, что я искал. pkill
не работает с именем без флага.
Когда установлен флаг -f
, используется вся команда для сопоставления по шаблону.
Самый простой способ — сначала проверьте, получаете ли вы правильные идентификаторы процессов с помощью команды:
pgrep -f [часть_команды]
Если результат соответствует ожиданиям, продолжайте с:
pkill -f [часть_команды]
Если процессы зависли и не могут выполнить запрос, вы можете использовать команду kill:
kill -9 $(pgrep -f [часть_команды])
Если хотите быть на безопасной стороне и завершать только те процессы, которые вы изначально запустили, добавьте ключ -u
с вашим именем пользователя:
pkill -f [часть_команды] -u [имя_пользователя]
Вы можете использовать команду kill
вместе с выводом команды pidof
для завершения всех процессов Firefox. Вот как это можно сделать:
kill `pidof firefox`
Эта команда сначала находит все идентификаторы процессов (PID) для запущенных экземпляров Firefox с помощью команды pidof
, а затем передает их в команду kill
, чтобы завершить эти процессы.
Если вам нужно более безопасно завершить процессы, вы можете использовать сигнал, например, SIGTERM
:
kill -TERM `pidof firefox`
Или, если вы хотите завершить процессы силой (например, когда стандартное завершение не срабатывает), вы можете использовать SIGKILL
:
kill -KILL `pidof firefox`
Обратите внимание, что использование обратных кавычек (`
) может быть заменено на $()
для лучшей читаемости:
kill $(pidof firefox)
Этот подход более современный и удобный для чтения.
Чтобы завершить все процессы, запускаемые из определенной директории, можно использовать "snippet" для указания пути. Это особенно полезно, когда вы запускаете несколько компонентов одного приложения из одной и той же директории.
Вот команда, которая поможет вам убить все процессы, содержащие snippet
в пути запуска:
ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill
Если у вас есть pgrep
, предпочтительно использовать его, так как это более элегантный способ. Вот пример команды с использованием pgrep
:
pgrep -f <snippet> | xargs kill
Здесь -f
позволяет pgrep
искать по полному пути, а xargs kill
завершает процессы с найденными идентификаторами. Убедитесь, что вы запускаете эту команду с достаточными правами (возможно, с sudo
), если процессы требуют этого.
Как запросить ввод Yes/No/Cancel в скрипте оболочки Linux?
Как использовать 'grep' для непрерывного потока?
Прерывание скрипта оболочки при возвращении любой команды ненулевого значения
Как передавать параметры в Bash-скрипт?
Shell Script: Чтение ввода на той же строке после вывода сообщения