如果我沒有管理員權限,如何在 GNOME 註銷期間執行腳本?
我想在退出 GNOME 會話之前執行一個腳本,以在我忘記插入機器的 pendrive 時警告自己。
但是,我發現的所有解決方案對我來說都不夠:
當您使用 Gnome 時,您可以使用下面的 Python 腳本,改編自您提到的腳本。
它需要 Gnome 註銷(即
gnome-session-quit
)(或 gnome 關閉),當我們在 GUI 中使用註銷時會發生這種情況。AFAIK 沒有程序可以通過命令sudo shutdown -h 0
或sudo poweroff
. 執行時shutdown
,它會向所有程序提供 SIGTERM 並讓它們退出幾秒鐘(在執行一些非 root 使用者無法編輯的腳本之後)。如果未退出的程序被 SIGKILL 強行殺死。這是方法的逐步過程
gnome_save_yourself
。讓我們做一個測試。
- 將以下程式碼另存為
~/Desktop/execute_script_on_shutdown.sh
(來自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()
- 使其可執行:
chmod +x ~/Desktop/execute_script_on_shutdown.sh
- 將以下內容另存為
~/Desktop/shutdown_script.sh
#!/usr/bin/bash touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
- 執行主腳本
bash ~/Desktop/execute_script_on_shutdown.sh
現在你覺得腳本在等待什麼
- 註銷或關閉您的作業系統 (Ubuntu)
- 登錄
- 檢查
AAAAAAAAAAAAAAAAAAAAAAAAAAA
桌面上命名的文件。ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
如果你看到文件一切正常。現在您可以
shutdown_script.sh
根據需要進行編輯。還記得execute_script_on_shutdown.sh
在登錄時執行(或使其在啟動時自動執行)。
如果您希望您的會話在所有情況下都被阻止,您需要 root 權限。沒有辦法解決這個問題。使用者 root 始終
kill -9
可以處理您的程序。我很驚訝關機不會讓 gnome 發出“保存自己”的信號。此外,我相信“PostSession”腳本僅在 gnome-session 終止後和(我相信)在 Xserver 終止之前執行,這意味著這不是您想要在螢幕上顯示警告的地方(如果我是對的)。可能有用的是一個 Gnome 應用程序,它 a) 對“save-yourself” gnome 事件做出反應,並且 b) 對 SIGTERM 做出反應,就像它對“safe-yourself”做出反應一樣。除此之外,您幾乎無能為力,尤其是在沒有 root 權限的情況下。
但是,您可以解決非 root 問題:編寫一個 PostSession 腳本來執行您想要的操作,並建議具有 root 權限的人將其部署到所有機器上,因為它是一個可以幫助使用者很多的明智工具。通常,擁有 root 權限的人會得到報酬以使/讓使用者滿意。:-)
您要解決的問題是什麼?為什麼插入 pendrive 時不能退出會話?
您可以擁有一個顯示“不要忘記拔掉設備!”的 dbus 客戶端。當 gvfs 宣佈在 USB 設備上解除安裝文件系統時。但我不知道它的效果如何,甚至不符合您的目的。