答案1
当您使用 Gnome 时,您可以使用下面的 Python 脚本,该脚本改编自您提到的脚本。
它需要 Gnome 注销(即gnome-session-quit
)(或 gnome shutdown),当我们在 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
(或使其在启动时自动执行)。
答案2
如果您希望会话在所有情况下都被阻止,则需要 root 权限。没有办法解决这个问题。用户 root 始终可以访问kill -9
您的进程。令我惊讶的是,关闭并不会让 gnome 发出“拯救自己”的信号。另外,我相信“PostSession”脚本仅在 gnome-session 终止后和(我相信)Xserver 终止前运行,这意味着这不是您想要在屏幕上显示警告的地方(如果我是对的)。
可能有效的是一个 Gnome 应用程序,它 a) 对“save-yourself”gnome 事件做出反应,并且 b) 对 SIGTERM 作出反应,其方式与对“safe-yourself”的反应相同。除此之外,你几乎无能为力,尤其是在没有 root 权限的情况下。
但是,您可以解决非 root 问题:编写一个 PostSession 脚本来执行您想要的操作,并建议具有 root 权限的人将其部署在所有计算机上,因为它是一个可以为用户提供很多帮助的明智工具。通常,拥有 root 权限的人会得到报酬,以让/让用户满意。 :-)
您想要解决的问题是什么?为什么插入 U 盘后无法注销会话?
您可以有一个显示“不要忘记拔掉设备!”的 dbus 客户端。当 gvfs 宣布卸载 USB 设备上的文件系统时。但我不知道它的效果如何,甚至不知道它是否能达到你的目的。
答案3
我终于成功地实际测试了我在问题中作为第二个选项提到的Python脚本。事实证明,它做在要求关闭时也起作用,而不仅仅是在重新启动时。