O que acontece quando eu pressiono “Desligar” na GUI?

15

Eu tenho batido minha cabeça contra isso por um bom tempo agora. Está relacionado a esta pergunta . Gostaria de descobrir exatamente o que acontece quando escolho desligar minha caixa do Linux a partir da GUI. Isso parece estar mal documentado (se é que existe).

Idealmente, espero uma resposta independente de DE e OS. Exceto isso, estou interessado no caso específico do Mandriva 2010.1 e Debian 6.x (Squeeze) e 7.0 (Wheezy), todos rodando o Gnome. (Se você está prestando muita atenção, sim, é o Gnome 2 e o Gnome 3)

Basicamente, gostaria de saber qual comando / script / sequência de scripts é iniciado quando pressiono "Desligar" ou "Reiniciar" para poder modificar o comportamento deles. Algumas postagens no fórum que eu olhei sugerem hackers, /etc/polkit-1/*mas essa estrutura de diretórios é apenas um esqueleto na minha caixa Debian (Squeeze), por exemplo.

Alguém pode ajudar?


EDITAR

O que eu tentei até agora

  • Substituído o shutdownexecutável por um script próprio. Isso não funciona: quando eu pressiono o shutdownGnome efetua logout sem executar meu script.
  • Tentei editar o menu do Gnome 2. Sem alegria: as opções "Desligar", "Sair" e "Bloquear tela" não aparecem no editor de menus.
  • Olhado /usr/share/menu, nada de útil lá.

Possíveis avenidas para a solução

  • straceas opções da GUI (isso é possível?)
  • Olhando para shutdowno código fonte do
  • Olhando para gnome-sessiono código fonte do

Atualizar

De acordo com meus comentários na resposta abaixo, analisei as polkitações abaixo /usr/share/polkit-1/actions/e encontrei (no arquivo org.freedesktop.consolekit.policy) uma ação chamada org.freedesktop.consolekit.system.stop-multiple-usersque lança a mensagem

System policy prevents stopping the system when other users are logged in

Estou pensando (devido à org.freedesktop.*convenção de nomenclatura) que esse é algum tipo de sinal enviado ao DM via D-BUS. Além disso, essa mensagem aparece ao tentar desligar graficamente enquanto outros usuários estão conectados; portanto, o mecanismo que a aciona deve ser o mesmo mecanismo acionado quando "Desligar" ou "Desligar" é selecionado na GUI.

Alguém pode confirmar / refutar? Existe a possibilidade de alguma forma interceptar esse sinal ou modificá-lo?

Joseph R.
fonte
O que você está tentando realizar? Você pode adicionar uma edição /etc/init.d/rc.localpara chamar um script ao ser interrompido .
depquid
@depquid O que estou tentando realizar está na minha pergunta mais antiga, à qual me vinculei: estou tentando impedir que um usuário conectado localmente atravesse a sessão SSH de outro usuário.
Joseph R.

Respostas:

9

Depende do seu Gerenciador de exibição! (ou seja, KDM, GDM)

Por favor, tenha em mente que seu DM é executado como root! (ele precisa de privilégios de root para executar o processo da sessão como o usuário que você efetua login)

Quando você clica em desligar no KDE ou GNOME, o seu DE envia um sinal ao seu DM para desligar ou reiniciar após o término da sessão. Em seguida, seu DE instrui todos os programas a terminarem e, quando todos os outros processos terminam (ou expiram o tempo limite), o último processo do DE - o processo da sessão - termina.

O processo da sessão é o primeiro processo iniciado em uma sessão X11. Quando é morto ou termina, a sessão termina. Você já viu esse xterm ao executar o X sem DE? Esse é um processo de sessão. Esse processo é chamado kdeinitno KDE e gnome-sessionno GNOME.

Depois que a sessão termina, o controle é retornado ao seu mestre (que estava aguardando o término do processo X) e verifica o que o DE pediu para ele fazer. Se ele disse para desligar ou reiniciar, ele fará isso. Em outro caso, ele iniciará uma nova tela de login no X.

Isso também está relacionado aos problemas que você pode ter tido no passado, com alguns DE não conseguindo desligar ou reiniciar, apenas para efetuar logout, quando usados ​​em combinação com outros DMs.

De qualquer forma, isso não é tão ruim documentado. O GDM possui uma página de manual de um comando que permite que você o desligue, como eu disse antes ( gdm-control). O KDM também possui excelente documentação e possui um utilitário semelhante (um pouco mais complexo) chamado kdmctl.


O desligamento e a reinicialização são possíveis sem o PolicyKit, mas o PolicyKit serve a muitos propósitos necessários nos sistemas atuais, como montar discos sem ser root, suspender ou hibernar o computador. E também não está mal documentado!

Verifique isso se você quiser saber mais sobre o que é o PolicyKit e como ele funciona: http://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html

Alicia
fonte
Parece promissor. Obrigado pelos links para os documentos. Não tenho dúvidas de que esses manuais são abrangentes e claros, mas poderiam muito bem não existir. Sua resposta é a primeira vez que vi o gerente de exibição mencionado em conjunto com esse problema, portanto, não é exatamente um conhecimento comum. Vou tentar isso e que você saiba ...
Joseph R.
ESTÁ BEM. gdm-controlnão foi de nenhuma ajuda. A documentação fornecida no PolicyKit parece mais promissora. Vou me aprofundar nisso e ver se consigo implementar uma regra personalizada. Para ser continuado ...
Joseph R.
1
Fiz algumas leituras (skimming, mais parecido) e, por favor, corrija-me se estiver errado: o DE, quando solicitado a desligar, enviará uma mensagem ao DM através do polkit no D-BUS. Na autenticação pendente, a sessão pode ser encerrada ou a solicitação revogada. Isto é definido em uma polkitação chamada org.freedesktop.consolekit.system.stop-multiple-usersem /usr/share/polkit-1/actionsEle é definido para revogar o pedido de usuários inativos e auth_admin_keeppara o usuário ativo. A questão é: o que define essa ação? O que exatamente ele executa?
Joseph R.
@don_crissti Isso agora eu entendo. O que me interessa é justamente esse "sinal". Qual é o cliente que o envia?
Joseph R.
@don_crissti Gostaria de passar este comentário para minha outra pergunta para acompanhamento?
Joseph R.