Назад | Перейти на главную страницу

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

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

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

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

Прежде всего: как сказал @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 завершит процесс несмотря ни на что, что может вызвать всевозможные забавные эффекты, особенно с базами данных.