How can I run a script during GNOME logout if I don't have admin privileges?
As you are using Gnome, you can use the Python script below, adapted from the one you mentioned.
It needs a Gnome logout (ie gnome-session-quit
) (or gnome shutdown), the one happens when we use the logout in GUI. AFAIK no process can block a shutdown by the command sudo shutdown -h 0
or by sudo poweroff
. When shutdown
is execued it gives SIGTERM to all process and gives a few seconds to them to exit (After executing some scripts which can't be edited by non root users ). If not exited processes are forcefully killed by SIGKILL.
This is the step by step procedure of gnome_save_yourself
method. Let's do a test.
Save following code as
~/Desktop/execute_script_on_shutdown.sh
(From http://www.linuxquestions.org/questions/linux-desktop-74/gnome-run-script-on-logout-724453/#post3560301)#!/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()
Make it executable:
chmod +x ~/Desktop/execute_script_on_shutdown.sh
Save the following as
~/Desktop/shutdown_script.sh
#!/usr/bin/bash touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
Execute the main script
bash ~/Desktop/execute_script_on_shutdown.sh
Now you feel the script wait for something
- Log Out or shutdown your OS (Ubuntu)
- Log in
Check for a file named
AAAAAAAAAAAAAAAAAAAAAAAAAAA
on your desktop.ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
If you see the file everything OK. Now you can edit the shutdown_script.sh
to suit your need. Also remember to execute the execute_script_on_shutdown.sh
on login (or make it auto executable on startup).