Executei um contêiner usando a imagem alpina e executei timeout
um comando nele. Após a timeout
execução do comando, resta um processo inativo no Alpine e não consigo eliminá-lo usando o comando kill. Meu fluxo de execução é o seguinte: Execute um contêiner alpino
# cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.20.0
PRETTY_NAME="Alpine Linux v3.20"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
Use o timeout
para executar um comando
# timeout -k 10 5 /bin/sleep 20
Terminated
Depois disso, um processo morto com timeout é deixado no contêiner e não pode ser eliminado com kill.
# ps -ef
PID USER TIME COMMAND
1 root 0:00 sleep infinity
18 root 0:00 sh
33 root 0:00 [timeout]
36 root 0:00 ps -ef
# kill -9 33
# ps -ef
PID USER TIME COMMAND
1 root 0:00 sleep infinity
18 root 0:00 sh
33 root 0:00 [timeout]
37 root 0:00 ps -ef
versão de tempo limite
# timeout --help
BusyBox v1.36.1 (2024-05-21 13:38:37 UTC) multi-call binary.
Usage: timeout [-s SIG] [-k KILL_SECS] SECS PROG ARGS
Run PROG. Send SIG to it if it is not gone in SECS seconds.
Default SIG: TERM.If it still exists in KILL_SECS seconds, send KILL.
Muito provavelmente o pai do processo de tempo limite terminou antes do processo de tempo limite e, portanto, não pôde esperar por ele. Quando o pai de um processo morre antes de seu filho, o filho fica órfão e é adotado pelo processo com pid 1. Este é normalmente o processo init cuja principal tarefa após a inicialização do sistema é aguardar o término de tais processos órfãos, mas os contêineres não não necessariamente tem esse processo de inicialização (consulte https://stackoverflow.com/questions/49162358/docker-init-zombies-why-does-it-matter para alguma discussão sobre isso).
Usar a
--init
opção do seudocker run
comando deve corrigir isso.