Como posso executar um script durante o logout do GNOME se eu não tiver privilégios de administrador?

14

Eu quero executar um script antes de sair da minha sessão do GNOME, para me avisar se esqueci um pendrive conectado à máquina.

No entanto, todas as soluções que encontrei não foram suficientes para mim:

  • Esta pergunta semelhante sugere editar o arquivo /etc/gdm/PostSession/Default , mas não tenho permissão para isso. (E o arquivo está vazio na minha máquina, então não há ganchos para tirar vantagem)

  • Também encontrei este post sugerindo uma solução alternativa, mas, de acordo com a primeira resposta, ela não funciona se eu desligar o computador em vez de fazer o logoff apenas.

por hugomg 28.09.2012 / 00:57

3 respostas

0

Eu finalmente consegui testar o script Python que mencionei como a segunda opção da minha pergunta. Acontece que ele funciona ao pedir para desligar também, não apenas na reinicialização.

    
por 29.09.2012 / 00:30
5

Como você está usando o Gnome, você pode usar o script Python abaixo, adaptado daquele que você mencionou.

Ele precisa de um logout do Gnome (ou seja, gnome-session-quit ) (ou do desligamento do gnome), o que acontece quando usamos o logout na GUI. AFAIK nenhum processo pode bloquear um desligamento pelo comando sudo shutdown -h 0 ou por sudo poweroff . Quando shutdown é executado, dá SIGTERM para todo o processo e dá alguns segundos para que eles saiam (Após a execução de alguns scripts que não podem ser editados por usuários não-root). Se não for encerrado, os processos são mortos pela SIGKILL.

Este é o procedimento passo a passo do método gnome_save_yourself . Vamos fazer um teste.

  1. Salvar o código a seguir como ~/Desktop/execute_script_on_shutdown.sh (De link )

    #!/usr/bin/env python
    
    #Author: Seamus Phelan
    
    #This program runs a custom command/script just before gnome shuts 
    #down.  This is done the same way that gedit does it (listening for 
    #the 'save-yourself' event).  This is different to placing scipts 
    #in /etc/rc#.d/ as the script will be run before gnome exits.
    #If the custom script/command fails with a non-zero return code, a 
    #popup dialog box will appear offering the chance to cancel logout
    #
    #Usage: 1 - change the command in the 'subprocess.call' in 
    #           function 'session_save_yourself' below to be what ever
    #           you want to run at logout.
    #       2 - Run this program at every gnome login (add via menu System 
    #           -> Preferences -> Session)
    # 
    #
    
    import sys
    import subprocess
    import datetime
    
    import gnome
    import gnome.ui
    import gtk
    
    
    class Namespace: pass
    ns = Namespace()
    ns.dialog = None
    
    
    def main():
        prog = gnome.init ("gnome_save_yourself", "1.0", gnome.libgnome_module_info_get(), sys.argv, [])
        client = gnome.ui.master_client()
        #set up call back for when 'logout'/'Shutdown' button pressed
        client.connect("save-yourself", session_save_yourself)
        client.connect("shutdown-cancelled", shutdown_cancelled)
    
    
    def session_save_yourself( *args):
            #Lets try to unmount all truecrypt volumes
    
    
        #execute shutdowwn script
        #########################################################################################
        retcode = subprocess.call("bash /home/totti/Desktop/shutdown_script.sh", shell=True)
        ##########################################################################################
        if retcode != 0:
            #command failed  
            show_error_dialog()
        return True
    
    def shutdown_cancelled( *args):
        if ns.dialog != None:
            ns.dialog.destroy()
        return True
    
    
    def show_error_dialog():
        ns.dialog = gtk.Dialog("There was a problem running your pre-shutdown script",
                               None,
                               gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
                               ("There was a problem running your pre-shutdown script - continue logout", gtk.RESPONSE_ACCEPT))
        if ns.test_mode == True:
            response = ns.dialog.run()
            ns.dialog.destroy()
        else:
            #when in shutdown mode gnome will only allow you to open a window using master_client().save_any_dialog()
            #It also adds the 'Cancel logout' button
            gnome.ui.master_client().save_any_dialog(ns.dialog)
    
    
    
    #Find out if we are in test mode???
    if len(sys.argv) >=2 and sys.argv[1] == "test":
        ns.test_mode = True
    else:
        ns.test_mode = False
    
    if ns.test_mode == True:
        main()
        session_save_yourself()
    else:
        main()
        gtk.main() 
    
  2. Torne-o executável:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. Salve o seguinte como ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. Execute o script principal

    bash ~/Desktop/execute_script_on_shutdown.sh
    

Agora você sente o script esperar por algo

  1. Sair ou desligar o seu sistema operacional (Ubuntu)
  2. Fazer login
  3. Verifique se há um arquivo chamado AAAAAAAAAAAAAAAAAAAAAAAAAAA em sua área de trabalho.

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

Se você ver o arquivo tudo OK. Agora você pode editar o shutdown_script.sh de acordo com sua necessidade. Lembre-se também de executar o execute_script_on_shutdown.sh no login (ou torná-lo auto executável na inicialização).

    
por 14.01.2014 / 09:19
1

Se você quiser que sua sessão seja bloqueada em todas as circunstâncias, você precisa de privilégios de root. Não há como evitar isso. A raiz do usuário pode sempre kill -9 de seus processos. Estou surpreso que um desligamento não faça o gnome emitir o sinal "salve-se". Também acredito que os scripts "PostSession" são executados somente após o gnome-session ter terminado e (acredito) pouco antes do Xserver terminar, o que significa que não é o lugar onde você deseja colocar um aviso que deve aparecer na tela (se Estou correto).

O que pode funcionar é uma aplicação Gnome que a) reage ao evento "save-yourself" do gnome AND b) reage ao SIGTERM da mesma forma que reage ao "safe-yourself". Além disso, há pouco que você pode fazer, especialmente sem privilégios de root.

No entanto, você pode resolver o problema não raiz: Escreva um script PostSession que faça o que você quer e sugira a alguém com privilégios de root para implantá-lo em todas as máquinas, pois é uma ferramenta sensata que ajuda muito os usuários. Geralmente os caras com privilégios de root são pagos para deixar / manter os usuários felizes. : -)

Qual é o problema que você está tentando resolver? Por que você não pode sair de sua sessão quando um pendrive está conectado?

Você pode ter um cliente dbus que exiba "Não esqueça de desconectar o dispositivo!" Quando o gvfs anuncia a desmontagem de um sistema de arquivos em um dispositivo USB. Mas eu não sei o quão bem isso funciona ou até serve aos seus propósitos.

    
por 28.09.2012 / 10:26

Tags