У меня есть простая команда Docker, чтобы убить процесс базы данных:
docker exec app-pgsql bash -c 'ps axuf |grep ils |cut -d" " -f3 |xargs kill -9 || :'
и, как вы можете видеть, я ищу 3-й столбец из 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
завершит процесс несмотря ни на что, что может вызвать всевозможные забавные эффекты, особенно с базами данных.