Back to blog

Por que o who não funciona no contêiner Docker?

3 min de leitura
785 palavras

Mas primeiro o que é o comando who ?

O comando who exibe informações sobre todos os usuários atualmente no sistema local. As seguintes informações são exibidas: nome de login, tty, data e hora do login. Digitar who e exibirá seu nome de login, tty, data e hora em que você efetuou login. Se o usuário estiver conectado a partir de uma máquina remota, o nome do host dessa máquina também será exibido. O comando who também pode exibir o tempo decorrido desde a ocorrência da atividade da linha, o ID do processo do interpretador de comandos (shell), logins, logoffs, reinicializações e alterações no relógio do sistema, bem como outros processos gerados pelo processo de inicialização.

image

  1. Ausência de utmp e wtmp: O comando who depende dos arquivos /var/run/utmp e /var/log/wtmp, que armazenam informações sobre usuários logados. Estes arquivos não são gerados ou mantidos dentro de contêineres por padrão, já que contêineres são frequentemente projetados para rodar processos únicos e não suportam múltiplos logins interativos como em servidores tradicionais.
  2. Sessões Limitadas em Contêineres: Contêineres geralmente não são usados para suportar logins interativos de múltiplos usuários. O foco é em processos isolados. Isso torna o sistema de gerenciamento de sessões, que o comando who depende, desnecessário.

Alternativas

Para monitorar o estado de um contêiner ou entender quais processos estão em execução, aqui estão algumas abordagens alternativas:

1. Verifique Processos com ps

Embora você não possa usar who, você pode verificar quais processos estão sendo executados e sob quais usuários usando o comando ps.

ps aux

Isso mostrará todos os processos em execução no contêiner, incluindo o usuário sob o qual estão sendo executados.

Exemplo de saída:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
postgres     1  0.0  0.0 212160 15972 ?        Ss   08:42   0:00 postgres
postgres    15  0.0  0.0 213672 17192 ?        Ss   08:42   0:00 postgres :checkpointer

2. Usuário Atual com whoami

Você pode verificar o usuário atual dentro do contêiner com o comando whoami:

whoami

Isso mostrará o usuário que está executando o shell ou o processo atual. Em um contêiner PostgreSQL típico, isso provavelmente será postgres.

3. Entrar no Contêiner e Verificar Usuário

Se você quiser verificar quem está rodando os processos manualmente, pode entrar no contêiner com docker exec e usar comandos como whoami ou ps.

docker exec -it <nome_do_conteiner> /bin/sh
whoami
ps aux

Para ver os processos em execução em um sistema Linux, você pode usar os seguintes comandos:

  1. ps: Mostra uma lista dos processos em execução.
    • ps aux ou ps -aux: Mostra todos os processos com detalhes adicionais.
    • ps -ef: Exibe uma lista de processos em um formato de lista completa.
  2. top: Mostra uma visão em tempo real dos processos em execução e suas informações de uso de recursos.
    • Apenas digite top e pressione Enter para visualizar a lista de processos em tempo real.
  3. htop: Uma versão melhorada do top, com uma interface mais amigável e opções de filtragem e interação.
    • Pode não estar instalado por padrão. Para instalar, use sudo apt-get install htop (em distribuições baseadas no Debian/Ubuntu) ou sudo yum install htop (em distribuições baseadas no Red Hat/CentOS). Após a instalação, digite htop para usá-lo.
  4. pgrep: Procura processos com base em critérios, como nome.
    • pgrep nome_do_processo: Mostra os IDs dos processos que correspondem ao nome fornecido.
  5. pstree: Exibe uma árvore hierárquica dos processos em execução.
    • Pode não estar instalado por padrão. Para instalar, use sudo apt-get install pstree (em distribuições baseadas no Debian/Ubuntu) ou sudo yum install pstree (em distribuições baseadas no Red Hat/CentOS). Após a instalação, digite pstree para visualizar a árvore de processos.

Conclusão

Comandos como who não funcionam em contêineres minimalistas como os baseados no Alpine Linux porque não há suporte para múltiplas sessões de login, e arquivos como /var/run/utmp ou /var/log/wtmp não são gerados. No entanto, você pode usar comandos como ps aux e whoami para monitorar os processos e o usuário em execução no contêiner.