Yönetici ayrıcalıklarım yoksa GNOME oturumu kapatma sırasında bir komut dosyasını nasıl çalıştırabilirim?


18

GNOME oturumumdan çıkmadan önce bir komut dosyası çalıştırmak, makineye takılı bir pendrive'ı unutursam kendimi uyarmak istiyorum.

Ancak bulduğum tüm çözümler benim için yeterli değildi:

  • Bu benzer soru/etc/gdm/PostSession/Default dosyayı düzenlemeyi önerir , ancak bunu yapma iznim yok. (Ve dosya şu anda makinemde boş, bu yüzden yararlanmak için mevcut kanca yok)

  • Ben de bu yazı bir geçici çözüm düşündüren bulundu , ancak ilk cevaba göre, sadece oturumu kapatmak yerine bilgisayarı kapatırsanız çalışmaz.


Yanıtlar:


7

Gnome'u kullanırken, aşağıda belirttiğiniz koddan uyarlanmış Python komut dosyasını kullanabilirsiniz.

Bir Gnome oturumu kapatma (yani gnome-session-quit) (veya gnome kapatma) gerekir, GUI'de oturum kapatmayı kullandığımızda gerçekleşir. AFAIK hiçbir işlem komutla sudo shutdown -h 0veya komutla kapatmayı engelleyemez sudo poweroff. Ne zaman shutdownexecued edilir tüm süreci SIGTERM verir ve (sigara kök kullanıcılar tarafından düzenlenemez bazı komut çalıştırıldıktan sonra) çıkmak için onlara birkaç saniye verir. Çıkmazsa süreçler SIGKILL tarafından zorla öldürülür.

Bu, gnome_save_yourselfyöntemin adım adım prosedürüdür . Bir test yapalım.

  1. Aşağıdaki kodu şu şekilde kaydedin ~/Desktop/execute_script_on_shutdown.sh ( http://www.linuxquestions.org/questions/linux-desktop-74/gnome-run-script-on-logout-724453/#post3560301 adresinden )

    #!/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. Yürütülebilir yap:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. Aşağıdakileri farklı kaydet ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. Ana komut dosyasını yürütün

    bash ~/Desktop/execute_script_on_shutdown.sh
    

Şimdi senaryonun bir şey beklediğini hissediyorsun

  1. Oturumu kapatın veya işletim sisteminizi kapatın (Ubuntu)
  2. Oturum aç
  3. AAAAAAAAAAAAAAAAAAAAAAAAAAAMasaüstünüzde bir dosya olup olmadığını kontrol edin .

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

Eğer dosyayı görüyorsanız herşey yolunda. Şimdi shutdown_script.shihtiyacınıza göre düzenleyebilirsiniz . Ayrıca execute_script_on_shutdown.shoturum açma oturumunu çalıştırmayı (veya başlangıçta otomatik olarak çalıştırılabilir yapmayı) unutmayın.


1

Oturumunuzun her koşulda engellenmesini istiyorsanız kök ayrıcalıklarına ihtiyacınız vardır. Bunun hiçbir yolu yok. Kullanıcı kökü her zaman kill -9süreçlerinizi yapabilir . Bir kapatma gnome "kendinizi kurtarmak" sinyal yayar yapmak şaşırttı. Ayrıca "PostSession" komut dosyalarının sadece gnome-oturumu sonlandırıldıktan ve Xserver sona ermeden hemen önce (inanıyorum) çalıştırıldığına inanıyorum. Ben doğruyum).

Ne işe yarayabilir? A) "kendinizi kurtarın" gnome olayına tepki verir ve b) SIGTERM'e "kendinizi güvenli" olarak tepki verir gibi tepki veren bir Gnome uygulamasıdır. Bunun ötesinde, özellikle kök ayrıcalıkları olmadan yapabileceğiniz çok az şey var.

Ancak kök olmayan sorunu çözebilirsiniz: İstediğinizi yapan bir PostSession betiği yazın ve kullanıcılara çok yardımcı olan mantıklı bir araç olduğu için tüm makinelere dağıtmak için kök ayrıcalıklarına sahip birine önerin. Genellikle kök ayrıcalıklarına sahip olanlara, kullanıcıları mutlu etmek / mutlu etmek için ödeme yapılır. :-)

Çözmeye çalıştığınız sorun nedir? Bir pendrive takılıyken oturumunuzu neden kapatamazsınız?

"Cihazı fişten çekmeyi unutmayın!" Mesajını görüntüleyen bir dbus istemciniz olabilir. gvfs bir USB cihazındaki bir Dosya Sisteminin bağlantısını kestiğini duyurduğunda. Ama bunun ne kadar iyi çalıştığını ve hatta amaçlarınıza hizmet ettiğini bilmiyorum.


Bu bilgisayar laboratuvarındaki hesabım için; Oturumu kapattığımda pendrive'ım takılı olduğunu unutursam, eve gittiğimde behing bırakabilirim. Bu yüzden de kök ayrıcalıklarına sahip değilim (ve ne yazık ki burada yöneticiler için herhangi bir şey istemek çok bureokratik bir süreçtir). Dediğin gibi bir dbus istemcisi yapmak için ne yapmam gerekir? Böyle bir şeyle hiç çalışmadım ve arama yaparken gcfs'nin hangi mesajları desteklediğini söyleyen herhangi bir belge bulamıyorum.
hugomg

0

Sonunda sorumun ikinci seçeneği olarak bahsettiğim Python betiğini test etmeyi başardım. Sadece yeniden başlatıldığında değil, aynı zamanda kapanmayı da istediği zaman işe yaradığı ortaya çıkıyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.