4

Я пытаюсь убить любой процесс, связанный с MySQL. Я собираю команду, и до сих пор не нашел правильного решения. Еще одно соображение заключается в том, что последний процесс будет соответствовать команде 'grep mysql' - части команды ниже. Этот процесс больше не будет существовать к тому времени, когда я попытаюсь уничтожить его, поэтому его нужно исключить из входного канала для уничтожения -9. Как лучше всего выполнить эту задачу? Пока у меня есть неполная команда:

ps -A | grep mysql | awk '{print $1}'

который имеет (подделка, для целей этого примера) вывод

11111
22222
33333  # process id to be excluded

Я предполагал, что смогу передать это xargs kill -9 примерно так:

ps -A | grep mysql | awk '{print $1}' | xargs kill -9

и найти способ исключить последний pid, но все, что я пробую, похоже, не работает правильно.

6 ответов6

15

Вероятно, здесь проще всего сделать так, чтобы grep не совпадал с его собственной командой:

ps -A | grep [m]ysql | awk '{print $1}' | xargs kill -9

Скобки вокруг m делают его набором символов, который включает только m, который не меняет шаблон, но не соответствует самому себе в выводе ps . Это своего рода канонический способ избежать этой проблемы. Я также хотел бы добавить, что если у вас есть команда pkill то запуск pkill -9 mysql немного проще.

Стоит также отметить, что по возможности следует избегать использования SIGKILL (-9), так как это не дает целевому процессу возможности элегантного выхода. Вероятно, вам следует сначала попробовать SIGTERM (по умолчанию), если вы этого еще не сделали.

6

У Awk есть команда system(), которая позволяет вам убить его напрямую ... Что-то вроде этого.

ps ¦awk '/[m]ysql/{system( "kill -9 "$1)}'

Причина квадратных скобок аналогична предыдущей. Это препятствует тому, чтобы awk был убит и закрыл трубу.

/ String / выполнит grep-подобное сопоставление строк.

3

Для полноты я бы также предложил команды pgrep и pkill .

  • pgrep [-lf] [-u uid] [-other options] pattern список процессов, соответствующих шаблону расширенного регулярного выражения
  • шаблон уничтожения процессов pkill [-f] [-t**SIGNAL] pattern соответствующий шаблону

Наиболее интересные варианты, как указано, вероятно,

  • -f соответствует полной командной строке процесса
  • -u user только конкретным пользователям процессов (также групп ...)
  • -l перечислить имя / идентификатор процесса (только pgrep)

Для других, смотрите прекрасное руководство.

В целом, они гораздо более универсальны и полезны (с точки зрения способности действительно проверять, что вы убиваете, прежде чем делать это), чем killall или более сложные рецепты трубы, опубликованные выше.

1

Чтобы удалить последний из списка PID, вы можете использовать заголовок -n N, где n - количество PID без последнего.

пс -А | grep mysql | awk '{print $ 1}' | голова -n 2 | XARGS убить -9

Предполагается, что вы знаете номер PID, который будет передан из grep.

0

Или

killall mysql 

команда может сделать это за вас. Он использует имена вместо PID.

-2
kill -9 `ps aux | grep PROCESS_NAME | grep -v grep  |  cut -d' ' -f6`

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .