2015-01-03 10 views
7

Mam prosty przykład z oficjalnego przewodnika na stronie dokera.Jak zabić proces w pojemniku? Polecenie Docker top

uruchomić następujące:

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

następnie podjąć jakieś wyjście z utworzonego w opakowaniu:

sudo docker logs a66 
hello 
hello 
hello 
... 

Potem odnośnika procesów bieżących pojemniku:

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 

Następne I spróbuj zabić pierwszy proces pojemnika:

sudo docker exec a66 kill -9 25055 

Jednak po wprowadzeniu zmian nic się nie zmieni. Proces wciąż działa i wyświetla "cześć" co sekundę. Co mam nie tak?

Odpowiedz

8

Kiedy odtworzyć sytuację Widzę różne PID między docker top <container> i docker exec -it <container> ps -aux. Gdy wykonasz docker exec, polecenie zostanie wykonane wewnątrz kontenera => powinno używać pid kontenera. W przeciwnym razie możesz zabić bez dokera prosto z hosta, w twoim przypadku: sudo kill -9 25055.

+1

i normalnie można by zabić proces za pomocą 'docker kill ' oczywiście. –

+0

Dlaczego wartości PIDS różnią się między najwyższymi i średnimi wewnątrz kontenerów? To polecenie "top" pokazuje PIDS na komputerze-hoście? (Niestety nie mogę sprawdzić odpowiedzi na razie na telefon komórkowy) –

+1

tak, najwyraźniej "docker top" pokazuje PID hosta. –

1

sprawdzić to:

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

zrozumieć ten początek z poleceń wykonujących od lewej do końca każdego potoku (|)

Prostsze Opcja:

kill $(pidof a66) 
+0

Co to jest? 'ps | grep -i a66' to nie działa –

+0

jaki jest status powrotu? –

+0

Pytanie brzmi, dlaczego mój sposób nie działa, a nie w inny sposób. –

0

Zajęło mi trochę czasu, aby znaleźć właściwą odpowiedź, ale będziesz musiał zarządzać tym procesem z poziomu kontenera. Po uruchomieniu docker top a66 z hosta, PID pochodzą od twojego hosta, chociaż nie jest tak w przypadku używania Cygwin. Niezależnie od tego, będziesz musiał bash lub co-masz-ty z powrotem do pojemnika i używać poleceń, takich jak ps aux i kill, podczas gdy w pojemniku, aby znaleźć i zarządzać różnymi PID dla tych samych procesów tam.

0

szukałem czegoś takiego, ale nie mogłem znaleźć, a potem zrobiłem to:

[root @ notebooka ~] # doker exec -to tadeu_debian ps aux | grep ping | awk "{print 2 $}" xargs -I {} docker exec -i tadeu_debian kill -9

To był dwa "execs" od Docker e one xargs.

Mam nadzieję, że to pomoże komuś!