Debian 12.2 em um LXC sem privilégios (proxmox). São quase 11h45, horário local. Às 5h da manhã, o cron iniciou um script:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jan 26633 0.0 0.0 8500 2056 ? S 05:00 0:00 /usr/sbin/CRON -f
Estou usando pgrep -f CRON -O 600
e espero que o pgrep retorne o PID 26633, porque o processo tem muito mais de 600 segundos. Mas o pgrep não retorna nada. Se eu deixar de fora -O
, ele retornará corretamente o PID.
Fazendo o mesmo na máquina host, ou seja, fora do LXC, funciona corretamente.
Como o pgrep usa procps, olhei lá.
ps -o etime -p $pid
no LXC: 441077225-02:04:48
(errado, porque desde 5h, ~6h45 se passaram)
ps -o etime -p $pid
no host: 06:43:29
(correto)
Isso seria um bug no procps ou tem a ver com o LXC?
O LXC monta um falso
/proc/uptime
para simular o tempo de atividade do contêiner em vez do tempo de atividade do host, uma vez que esta propriedade não tem namespace. Aqui em um contêiner LXC (raiz):Mas não existe tal provisão para
stat
o pseudoarquivo de cada processo em/proc/PID/stat
.Portanto, quando
pgrep
compara o tempo, faz a diferença entre o atual/proc/uptime
e ostarttime
campo/proc/PID/stat
conforme descrito emproc(5)
e fontes procps :Como o contêiner
/proc/uptime
é falsificado pelo LXC (acho que usando/proc/uptime
o horário de início pid 1 do host menos o contêiner LXC), o resultado final obtém o horário de início do contêiner subtraído , resultando em um valor negativo inicialmente (e por algum tempo, mas ainda errado de qualquer maneira) se/quando se tornar positivo mais tarde), o que é inesperado, uma vez que o tempo de atividade do sistema deve ser maior que o start_time do processo de destino (possivelmente ajustado por um fator de$(getconf CLK_TCK)
). As ferramentas procps não conseguem lidar com isso corretamente.Não sei sobre uma solução alternativa: se
/proc/uptime
for restaurado para seu valor de host, entãopgrep -O
oups -o etime -p
calculará o valor correto, mas qualquer ferramenta que use o tempo de atividade do sistema agora obterá o tempo de atividade do host em vez do tempo de atividade (falsificado) do contêiner.