Как убить процесс внутри контейнера? Верхняя команда Docker

У меня есть простой пример из официального руководства на сайте докеров.

Я запускаю следующее:

sudo docker run -d ubuntu:latest /bin/sh -c "while true; do echo hello world; sleep 1; done"
a66asdasdhqie123...

Затем возьмите некоторый вывод из созданного контейнера:

sudo docker logs a66
hello
hello
hello
...

Затем я просматриваю запущенные процессы контейнера:

sudo docker top a66
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                25055               15152               0                   20:07               ?                   00:00:00            /bin/sh -c while true; do echo hello world; sleep 1; done
root                25295               25055               0                   20:10               ?                   00:00:00            sleep 1

Затем я пытаюсь убить первый процесс контейнера:

sudo docker exec a66 kill -9 25055

Однако после того, как я это сделаю, ничего не изменится. Процесс все еще работает и выводит «привет» каждую секунду. Что я не так?


person Timur Fayzrakhmanov    schedule 03.01.2015    source источник


Ответы (5)


Когда я воспроизвожу вашу ситуацию, я вижу разные PID между docker top <container> и docker exec -it <container> ps -aux. Когда вы делаете docker exec, команда выполняется внутри контейнера => следует использовать pid контейнера. В противном случае вы могли бы убить без докера прямо с хоста, в вашем случае: sudo kill -9 25055.

person Mykola Gurov    schedule 03.01.2015
comment
и обычно вы, конечно, убиваете процесс с помощью docker kill <container>. - person Mykola Gurov; 03.01.2015
comment
Почему PIDS различаются между верхними и внутренними идентификаторами контейнеров? То есть команда top показывает PIDS на хост-машине? (Извините, я не могу проверить ответ, я сейчас на мобильном телефоне) - person Timur Fayzrakhmanov; 04.01.2015
comment
да, docker top показывает PID хоста, судя по всему. - person Mykola Gurov; 04.01.2015
comment
Вы можете получить PID из контейнера как: docker inspect --format {{.State.Pid}} <container> - person Demiurg; 21.11.2017

Проверь это:

ps | grep -i a66 | tr -s ' '|cut -f2 -d' '|
{
    while read line;
    do kill -9 $line;
    done
}

чтобы понять это, начните с выполнения команд слева до конца каждой трубы (|)

Более простой вариант:

kill $(pidof a66) 
person Ganesh Kamath - 'Code Frenzy'    schedule 03.01.2015
comment
какой статус возврата? - person Ganesh Kamath - 'Code Frenzy'; 03.01.2015
comment
Вопрос в том, почему мой способ не работает, а не в том, как сделать по-другому. - person Timur Fayzrakhmanov; 03.01.2015
comment
Извините, но мне не нравится способ, которым вы предлагаете - он очень длинный и перегруженный. Может есть более простой вариант? - person Timur Fayzrakhmanov; 03.01.2015
comment
я отредактировал ответ (при необходимости добавьте sudo). Надеюсь это поможет. - person Ganesh Kamath - 'Code Frenzy'; 03.01.2015
comment
kill $(pidof a66). Где мне его запустить? Внутри контейнера или снаружи? Потому что нет никакого эффекта, где бы я его ни запускал. - person Timur Fayzrakhmanov; 03.01.2015
comment
этот ответ просто неверен. Идентификаторы контейнеров Docker не печатаются ps. - person Mykola Gurov; 03.01.2015

Мне потребовалось некоторое время, чтобы найти правильный ответ, но вам придется управлять этим процессом из контейнера. Когда вы запускаете docker top a66 с хоста, PID берутся с вашего хоста, хотя это не совсем так, если вы используете Cygwin. Несмотря на это, вам нужно будет bash или что у вас есть обратно в свой контейнер и использовать такие команды, как ps aux и kill, находясь в контейнере, чтобы найти и управлять различными PID для тех же процессов там.

person Spencer Williams    schedule 22.02.2016

я искал что-то подобное, но я не мог найти, и тогда я сделал это:

[root@notebook ~]# docker exec -it tadeu_debian ps aux | пинг | awk '{напечатать $2}' | xargs -I{} docker exec -i tadeu_debian kill -9

Это были два «исполнителя» из Docker и один xargs.

Ну, я надеюсь, что это поможет кому-то!

person Tadeu Bernacchi    schedule 31.03.2017

когда вы создаете Docker, используйте эту команду:

RUN apt-get install lsof

то в файле py вы можете использовать:

os.system("lsof /dev/nvidia* | awk '{print $2}' | xargs -I {} kill {}")

ПОМНИТЕ: эта команда убивает все процессы на GPU

person Ali Ganjbakhsh    schedule 26.04.2021