linux - ps имеют другой столбец с идентификатором процесса

У меня есть простая команда Docker, чтобы убить процесс базы данных:

docker exec  app-pgsql bash -c 'ps axuf |grep ils |cut -d" " -f3 |xargs kill -9 || :'

и, как вы можете видеть, я ищу 3-й столбец из ps , чтобы получить идентификатор процесса, но иногда этот столбец отличается: один раз третий, второй раз четвертый, в следующий раз снова третий и т. Д.
Есть ли лучшее решение для решения этой проблемы, независимо от того, какой будет столбец?

0
задан 23 August 2019 в 09:37
1 ответ

Прежде всего: как @HBruijn сказал в комментарии, используйте pkill, потому что использование метода в вашем вопросе, мягко говоря, хрупко.

Если вы все еще хотите использовать ps | filter_it | kill_it , я попытаюсь определить некоторые ошибки в команде, которую вы пытаетесь запустить. Возможно, это не ответ на ваш вопрос, но было бы слишком долго включать его в качестве комментария, так что вот и мы.

Во-первых, я не понимаю, как идентификатор процесса может оказаться в разных столбцах, для меня , когда я использую ps axuf , PID находится во втором столбце. Возможно, вы используете другую версию ps , у которой другие значения по умолчанию. Вы можете управлять выводом ps с помощью переключателя -o , поэтому, если вы используете что-то вроде

ps -ho pid,command

, тогда PID всегда будет в первом столбце.

Во-вторых, если вы используете grep, вы, вероятно, захотите также использовать второй grep -v . При передаче команд оболочка поддерживает все процессы в рабочем состоянии. Поскольку сам grep ils содержит ils , он вполне может оказаться в вашем окончательном списке. Поэтому, если вы используете grep для фильтрации, обязательно исключите сам grep , например:

ps -ho pid,command | grep ils | grep -v grep

В-третьих, использование cut - плохой способ обработки столбцов тексты, поскольку, если есть два разделителя, cut будет обрабатывать вход как имеющий лишний пустой столбец, делая вывод неоднозначным (своего рода). Используйте что-нибудь еще, например awk .

Итак, ваша последняя команда должна выглядеть так:

ps -ho pid,command | grep ils | grep -v grep | awk '{print $1}' | xargs kill -9

В этом случае вместо использования awk вы можете использовать cut (или что-то еще, например sed ), поскольку PID гарантированно будет первым столбцом, поэтому cut подойдет. Я редко использую cut и стараюсь избегать этого, поэтому получаю awk . :)

Последнее замечание: использование kill -9 обычно рассматривается как «последнее средство». Вы должны попытаться завершить процесс обычным способом, поскольку kill -9 завершит процесс несмотря ни на что, что может вызвать всевозможные забавные эффекты, особенно с базами данных.

1
ответ дан 4 December 2019 в 15:38

Теги

Похожие вопросы