답변1
Gnome을 사용할 때 언급한 스크립트를 수정한 다음 Python 스크립트를 사용할 수 있습니다.
gnome-session-quit
GUI에서 로그아웃을 사용할 때 발생하는 Gnome 로그아웃(예: )(또는 gnome 종료)이 필요합니다 . AFAIK는 명령 sudo shutdown -h 0
이나 종료를 통해 프로세스를 차단할 수 없습니다 sudo poweroff
. 실행되면 shutdown
모든 프로세스에 SIGTERM 신호를 보내고 종료할 때까지 몇 초의 시간을 줍니다(루트가 아닌 사용자가 편집할 수 없는 일부 스크립트를 실행한 후). 종료되지 않으면 SIGKILL에 의해 프로세스가 강제 종료됩니다.
다음은 방법의 단계별 프로세스입니다 gnome_save_yourself
. 테스트를 해보자.
다음 코드를 다음과 같이 저장합니다
~/Desktop/execute_script_on_shutdown.sh
(fromhttp://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
어떤 상황에서도 세션을 차단하려면 루트 권한이 필요합니다. 이 문제를 해결할 수 있는 방법이 없습니다. 사용자 루트는 항상 kill -9
프로세스에 액세스할 수 있습니다. 놀랍게도 닫아도 gnome은 "자신을 구하세요"라는 신호를 보내지 않습니다. 또한 "PostSession" 스크립트는 gnome-session이 종료된 후 그리고 Xserver가 종료되기 전에만 실행된다고 생각합니다. 이는 화면에 경고를 표시하려는 위치가 아니라는 것을 의미합니다(제가 옳다면).
작동할 수 있는 것은 a) "save-yourself" gnome 이벤트에 반응하고 b) "safe-yourself"에 반응하는 것과 동일한 방식으로 SIGTERM에 반응하는 Gnome 애플리케이션입니다. 그 외에도 특히 루트 액세스 없이는 할 수 있는 일이 거의 없습니다.
그러나 루트가 아닌 문제를 해결할 수 있습니다. PostSession 스크립트를 작성하여 원하는 작업을 수행하고 루트 액세스 권한이 있는 사람들이 이를 모든 컴퓨터에 배포하도록 권장합니다. 이는 사용자에게 많은 도움을 줄 수 있는 스마트 도구이기 때문입니다. 루트 액세스 권한이 있는 사람들은 사용자를 만족시키기 위해 돈을 받는 경우가 많습니다. :-)
해결하고 싶은 문제는 무엇입니까? USB 플래시 드라이브를 삽입한 후 세션에서 로그아웃할 수 없는 이유는 무엇입니까?
"장치를 분리하는 것을 잊지 마세요!"라고 말하는 dbus 클라이언트를 가질 수 있습니다. gvfs가 USB 장치에서 파일 시스템 마운트 해제를 알릴 때. 그러나 그것이 얼마나 효과적인지, 심지어 그것이 당신의 목적에 도움이 될지는 모르겠습니다.
답변3
마침내 질문의 두 번째 옵션으로 언급한 Python 스크립트를 실제로 테스트할 수 있었습니다. 그것은 밝혀졌다하다다시 시작할 때뿐만 아니라 종료하라는 메시지가 표시될 때도 작동합니다.