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
shutdown
executável por um script próprio. Isso não funciona: quando eu pressiono oshutdown
Gnome 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
strace
as opções da GUI (isso é possível?)- Olhando para
shutdown
o código fonte do - Olhando para
gnome-session
o código fonte do
Atualizar
De acordo com meus comentários na resposta abaixo, analisei as polkit
açõ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-users
que 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?
/etc/init.d/rc.local
para chamar um script ao ser interrompido .Respostas:
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
kdeinit
no KDE egnome-session
no 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) chamadokdmctl
.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
fonte
gdm-control
nã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 ...polkit
ação chamadaorg.freedesktop.consolekit.system.stop-multiple-users
em/usr/share/polkit-1/actions
Ele é definido para revogar o pedido de usuários inativos eauth_admin_keep
para o usuário ativo. A questão é: o que define essa ação? O que exatamente ele executa?