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