Como é um processo preso no modo ininterrupto de suspensão no logout do usuário?

3

Gostaria de perguntar sobre o impacto de um processo preso no estado de suspensão ininterrupta 'D' em um sistema Linux quando um usuário efetua logout.

A finalização de uma sessão de usuário pelo logout (não desligamento ou reinício) é possível mesmo em caso de um processo persistente de um usuário inactivo em suspensão do disco ou o sistema travaria / travasse na tentativa de logout? Se o logout for bem sucedido apesar do processo emperrado, o que acontece com o processo? Ele fica órfão e reparado? Ele continua para a próxima sessão do usuário? Além disso, se o processo estava acessando um segmento de memória compartilhada antes de entrar no modo de espera ininterrupta, o que acontece com a memória compartilhada e outros processos que o usam? Eles também são afetados? Como um sistema Linux lida com tais situações?

Esse estado é difícil de reproduzir de propósito, então não consigo descobrir uma maneira de testá-lo sozinho para saber a resposta.

Peço desculpas se uma pergunta semelhante foi respondida antes em algum lugar; Eu tentei pesquisar vários sites e quadros de mensagens sobre Linux para obter respostas a essas perguntas, mas a maioria das páginas parece apenas explicar o que é o sono ininterrupto e como evitar / corrigir o problema. Eu não consegui encontrar nenhum recurso explicando o que acontece com tal processo quando uma sessão de usuário termina sem reiniciar o sistema. A maioria das fontes apenas recomece a reiniciar o sistema para se livrar dele.

    
por Arnold 05.06.2017 / 15:21

2 respostas

0

Um processo 'D' é imortal, sendo o cenário comum um manipulador de arquivo NFS obsoleto. Se o processo estiver em segundo plano, um logout poderá ocorrer, mas não terá efeito sobre o processo de suspensão.

    
por 05.06.2017 / 16:39
0

Primeiro de tudo, obrigado a todos pelas respostas! Eu fiz alguns testes, então tentarei responder minha própria pergunta.

Eu testei a manipulação de processos ininterruptos no logout por systemd (no Ubuntu) e upstart (no Chromium OS). Descobri que a maneira mais fácil de fazer com que um processo de usuário arbitrário entre no estado de suspensão 'D' é colocando-o no subsistema de cgroup do freezer e alterando o freezer.status para FROZEN. ( link ) Depois disso, tentei terminar a sessão do usuário fazendo logout. Tanto quanto eu posso dizer, o comportamento esperado no logout tanto para o systemd quanto para o sabor do SO do Chromium é que todos os processos não-raiz devem ser eliminados antes do gerenciador de sessões sair.

O que aconteceu no logout foi que a sessão do usuário saiu limpa e, no caso do Chromium OS, o cryptohome também parece ter sido desmontado sem problemas (não encontrei nada nos logs do sistema sugerindo desmontar a falha). Como esperado, o processo congelado sobreviveu ao logout em ambos os casos e ainda era visível na parte superior. Ele não utilizou recursos e não foi acessível de nenhuma maneira depois de entrar na conta. Também não houve problemas ou erros ao entrar na conta. O processo desapareceu assim que mudei o freezer.status de FROZEN para THAWED. Não tenho certeza se esse comportamento é diferente quando o processo entra no estado 'D' por diferentes razões, como ser bloqueado ao tentar acessar o NFS etc. mas esperaria que os resultados fossem semelhantes.

    
por 10.06.2017 / 08:40

Tags