Ao desligar, você verá a caixa de diálogo "Tem certeza...". Ocasionalmente, quero enviar um lembrete para mim mesmo, por exemplo, para realizar um trabalho noturno em vez de desligar. Então eu precisaria exibir outra caixa de diálogo - antes ou ao lado da caixa "tem certeza". (ou qualquer outro lembrete óbvio serviria, como mudar a cor da caixa "você tem certeza", mas isso pode envolver mexer nas entranhas dos módulos do Linux que não desejo tentar.) Não consigo obter um novo .service arquivo para funcionar conforme descrito em outro lugar. Como talvez eu não tenha acesso à tela naquele ponto do desligamento, tentei adicionar "touch /home/myuser/i_ran" ao meu script de pré-desligamento. Também tentei adicioná-lo à cláusula stop do script init.d para atd. Nem fazer nada. O que funcionaria? Idealmente, ele deveria ser executado como meu usuário atual, ou se como root meu script puder ser enviado para meu usuário atual. Estou usando notify-send para minha caixa de diálogo e executando o Ubuntu 20.04, Gnome clássico.
Prefácio
Esta resposta não é uma solução direta para sua pergunta, mas sim uma importante discussão metodológica que deve orientar você e outros membros da comunidade que estão tentando ajudar na direção certa e, esperançosamente, economizar tempo e esforços.
Discussão
Você precisa primeiro segurar/bloquear o desligamento, o que pode ser feito de várias maneiras... Uma maneira fácil é a funcionalidade integrada fornecida pelo Free Desktop
systemd-inhibit
que pode ser simplesmente usada a partir do terminal ou de um script... E então você precisa exibir um janela de diálogo com uma determinada mensagem e isso não é tão simples quanto o acima ( primeiro requisito ), pois requer um servidor de exibição em execução e uma sessão gnome gráfica do usuário em execução ... Isso, no entanto, não é possível por métodos externos ( independente) para o gnome-shell, pois no momento em que o sistema for informado sobre o "desligamento", a sessão do gnome do usuário já terá sido encerrada e eliminado quaisquer chances de possíveis interações da GUI do usuário ... Portanto, suas duas opções, até onde eu sei, são:gedit
( O editor de texto ) no código-fonte vinculado na linha número 1407, onde a mensagem"There are unsaved documents"
é aquela que será exibida em a caixa de diálogo de confirmação de desligamento do gnome e é onde sua própria mensagem estaria em seu próprio aplicativo ... No entanto, para que isso funcione, o processo do seu aplicativo precisa estar em execução no momento em que um desligamento do sistema é tentado na sessão do usuário gnome. . Aqui está um exemplo de script Python mínimo ( usando Calculator do Gnome Core Apps como um aplicativo fictício ) que fará exatamente isso e nada mais:Soluções alternativas
As soluções alternativas são soluções alternativas menos nativas que podem ter a forma de, por exemplo, um script de desligamento como este:
... e então, você precisará usar esse script em vez do botão GUI de desligamento normal ... Você pode querer desabilitar o botão padrão ou vinculá-lo a este script (Você provavelmente precisará encontrar/escrever um extensão para a parte de link ) para obter uma aparência de funcionalidade nativa.
Outras soluções alternativas podem ser:
Discussão da sessão do Gnome
Embora o que acontece no Gnome permaneça no Gnome, ou seja, ele tem seus próprios métodos separados do resto dos processos ( internos do Gnome, quero dizer ), mas você pode usar as ferramentas certas para observar como funciona e tentar interagir com ele ... se você executa
dbus-monitor
no terminal, mantém-no em execução e tenta desligar / sair, em seguida, basta clicar no botão cancelar na caixa de diálogo de desligamento, então você notará métodos sendo chamados e sinais sendo emitidos em endereços diferentes e em particular um que contém ondeCanShutdown
um a verificação está sendo realizada para saber se o usuário tem permissão para desligar a máquina, que você pode interceptar com algo como:... execute-o e mantenha-o funcionando e tente, por exemplo, sair ... No entanto, isso é muito cedo.
Outra chamada que você notará é a chamada de abertura do diálogo que deve ter algo parecido com
EndSessionDialog
eOpen
também comCanceled
onde o primeiro é um método e o segundo é um sinal ... Você pode observar o diálogo, fechá-lo e enviar o sinal assim ( esteja avisado, seu sistema será desconectado/desligado, não importa o que você faça para evitá-lo ):... se você tentar isso, notará que a caixa de diálogo fecha após 3 segundos e até envia o
Canceled
sinal, mas sua sessão é encerrada após 60 segundos. Isso ocorre porque o Gnome define um contador em segundo plano que você precisará encontrar e encontrar uma maneira de desativá-lo também... Sim, eu sei o que você pensa :-)... De qualquer forma, você entendeu.Raffa escreveu uma longa resposta com muitos detalhes técnicos que deve ser inestimável para quem deseja criar uma solução elegante de acordo com o Gnome. Não tenho conhecimento do sistema Linux e Gnome para fazer isso, mas criei uma solução prática semelhante à da resposta de Raffa. Coloquei esta solução alternativa abaixo como a resposta aceita, mas com uma forte recomendação de ler a resposta de Raffa para obter informações técnicas, se você puder usá-la para criar uma solução melhor.
Gambiarra
Aplica-se a: Ubuntu 20.04/Gnome flashback metacity e muitas outras versões/mais antigas.
Objeto
Ser capaz de executar um script ou executável antes do início do desligamento, permitindo executá-lo ou cancelá-lo. Você pode, por exemplo, exibir um lembrete para executar um trabalho noturno.
O problema
O menu do sistema, acessado pelo ícone de roda dentada no canto superior direito da tela, contém a opção de menu "Desligar...". Ele não usa um arquivo .desktop, o que permitiria fácil alteração do comando a ser executado. E ignora as inibições do GTK , que os aplicativos configuram para avisar sobre alterações não salvas ou operações em andamento.
A solução alternativa
O novo desligamento possui um arquivo .desktop que chama um script de shell. Isto faz tudo o que você quiser, por exemplo, exibe uma caixa de informações ou executa um comando rápido. Após isso o script executa um comando de desligamento, diferente do menu do sistema, que observa as inibições do GTK e dá a opção de desligar ou cancelar.
A solução alternativa mostrada é para desligamento, mas pode ser adaptada para operações de reinicialização, suspensão e logout.
Para testar se uma determinada opção ou comando de desligamento ignora as inibições do GTK
Execute o Gnome Text Editor gedit e insira algum texto em um novo arquivo sem salvar. Isso aumenta uma inibição do GTK. Certifique-se de não ter nenhuma alteração ou processo real não salvo que não deva ser interrompido e execute o encerramento. Se observar inibições do GTK, o desligamento exibirá uma caixa de diálogo "Alguns processos ainda estão em execução", listando todos os aplicativos que geraram uma inibição, com um motivo em texto, permitindo que você continue independentemente ou cancele. Caso contrário, ele será executado sem aviso prévio.
Etapas para implementar a solução alternativa
Remova a entrada Desligar do menu superior direito do sistema
gsettings set com.canonical.indicator.session suppress-shutdown-menuitem true
Substitua-o por um novo aplicativo. Este será um script de shell que fará tudo o que você quiser. Ele deve retornar quando a operação for concluída ou o usuário descartar uma caixa de informações e o script executar um comando de desligamento.
Aqui está uma maneira básica de mostrar um lembrete se um arquivo de texto existir e contiver texto de lembrete. Salve isso como, por exemplo, ~/.local/bin/shutdown-notify.sh e execute
chmod +x ~/.local/bin/shutdown-notify.sh
para torná-lo executável.Crie um arquivo da área de trabalho para o novo desligamento
salve o seguinte código como (por exemplo) ~/.local/share/applications/shutdown.desktop
Encontre um ícone adequado ou crie um, 32x32px no formato PNG e salve no caminho fornecido acima na linha Icon= - aqui ~/.local/share/icons/shut-down-icon-32.png
Abra a pasta que contém o arquivo da área de trabalho e arraste o arquivo até a barra de menu na parte superior da tela. O cursor mudará para uma mão e um sinal de mais e você poderá soltá-lo no lado esquerdo ou direito.
Depois disso, a opção Desligar desaparecerá do menu do sistema, mas uma opção melhor será mostrada como um ícone na barra de menu.
Outras melhorias possíveis
Substituindo logout, reinicialização ou suspensão
Para substituir o Logout (pode não ser necessário, pois obedece às inibições do GTK), execute
gsettings set suppress-logout-menuitem true
Para substituir o Logout, Reiniciar E desligar, executegsettings suppress-logout-restart-shutdown true
O comando para executar na parte inferior do seu script de shell seriagnome-session-quit --reboot
ougnome-session-quit --logout
não investiguei como substituir Suspender ou qual comando usar.Adicione o novo desligamento como uma opção de menu do sistema como o antigo
Eu não tentei fazer isso. Existem extensões do Gnome que alteram as opções no menu do sistema, mas não consigo encontrar uma que faça isso ou que possa ser configurada para isso. Pode existir um, ou talvez alguém familiarizado com eles possa escrever ou adaptar um.
use uma inibição GTK para exibir um aviso
Se você quiser apenas exibir um aviso, o arquivo da área de trabalho poderá ser chamado
gnome-session-quit --power-off
diretamente e um script de shell fornecido pelo usuário não será necessário. Isso fará com que o próprio desligamento mostre uma caixa de diálogo "Alguns processos ainda estão em execução", com um motivo em texto. Neste caso você tem que criar uma aplicação GTK fictícia , em C ou Python, que aumenta a inibição e depois roda de forma invisível em segundo plano. Em C você incluiria as linhas, por exemplo