GNOMEセッションからログアウトする前にスクリプトを実行して、マシンに接続されたペンドライブを忘れた場合に自分自身に警告したい。
しかし、私が見つけたすべての解決策は私にとって十分ではありませんでした:
GNOMEセッションからログアウトする前にスクリプトを実行して、マシンに接続されたペンドライブを忘れた場合に自分自身に警告したい。
しかし、私が見つけたすべての解決策は私にとって十分ではありませんでした:
回答:
Gnomeを使用しているので、あなたが言及したものから適応した以下のPythonスクリプトを使用できます。
Gnomeのログアウト(つまりgnome-session-quit
)(またはgnomeのシャットダウン)が必要です。これは、GUIでログアウトを使用するときに発生します。私の知る限り、コマンドsudo shutdown -h 0
またはによってシャットダウンをブロックできるプロセスはありませんsudo poweroff
。ときshutdown
execuedされ、それは、すべてのプロセスに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
ファイルがすべて表示されたらOKです。これでshutdown_script.sh
、必要に応じてを編集できます。またexecute_script_on_shutdown.sh
、ログイン時に実行する(または起動時に自動実行可能にする)ことを忘れないでください。
すべての状況下でセッションをブロックする場合は、root特権が必要です。それを回避する方法はありません。ユーザーrootは常にkill -9
プロセスを実行できます。シャットダウンしてもgnomeが「save-yourself」信号を発しないことに驚いています。また、「PostSession」スクリプトは、gnome-sessionが終了した後、Xserverが終了する直前にのみ実行されると考えています。私は正しいです)。
動作するのは、a)「自分自身を保存」gnomeイベントに反応し、b)「自分自身に安全」に反応するのと同じ方法でSIGTERMに反応するGnomeアプリケーションです。特にルート権限がなければ、できることはほとんどありません。
ただし、ルート以外の問題は解決できます。ユーザーが大いに役立つ賢明なツールであるため、必要なことを実行するPostSessionスクリプトを作成し、ルート特権を持つユーザーに提案してすべてのマシンに展開します。通常、ルート特権を持つ人は、ユーザーを幸せにするために支払われます。:-)
解決しようとしている問題は何ですか?ペンドライブが接続されているときにセッションからログアウトできないのはなぜですか?
「デバイスのプラグを抜くのを忘れないでください!」と表示されるdbusクライアントを使用できます。gvfsがUSBデバイス上のファイルシステムのアンマウントをアナウンスするとき。しかし、それがどれほどうまく機能するのか、あなたの目的に役立つのかさえわかりません。