Answers:
在使用Gnome时,您可以使用下面提到的Python脚本改编而成的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
现在您感觉脚本正在等待某事
检查AAAAAAAAAAAAAAAAAAAAAAAAAAA
在桌面上命名的文件。
ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
如果看到文件,则一切正常。现在,您可以编辑shutdown_script.sh
以满足您的需要。还请记住execute_script_on_shutdown.sh
在登录时执行(或使其在启动时自动可执行)。
如果要在所有情况下都阻止会话,则需要root特权。没有办法解决。root用户可以始终使用kill -9
您的进程。我很惊讶关机不会使gnome发出“自行保存”信号。另外,我相信“ PostSession”脚本仅在gnome-session终止之后(并且我相信)仅在Xserver终止之前运行,这意味着您不是要在屏幕上显示警告的地方(如果我是对的。
可能起作用的是Gnome应用程序,其中a)对“自己保存”的gnome事件做出反应,b)对SIGTERM做出反应,就像对“ self-selfself”做出反应一样。除此之外,您无能为力,尤其是没有root权限的情况下。
但是,您可以解决非root用户的问题:编写一个PostSession脚本,该脚本可以执行您想要的操作,并建议具有root权限的人将其部署到所有计算机上,因为它是一种对用户有很大帮助的明智工具。通常,具有root特权的家伙会得到报酬,以使/使用户感到高兴。:-)
您要解决的问题是什么?插入笔式驱动器后,为什么不注销会话?
您可以拥有一个显示“不要忘记拔出设备电源!”的dbus客户端。当gvfs宣布在USB设备上卸载文件系统时。但是我不知道这种方法效果如何,甚至不能达到您的目的。