ฉันจะเรียกใช้สคริปต์ระหว่างออกจากระบบ GNOME ได้อย่างไรหากฉันไม่มีสิทธิ์ของผู้ดูแลระบบ


18

ฉันต้องการเรียกใช้สคริปต์ก่อนที่ฉันจะออกจากระบบ GNOME ของฉันเพื่อเตือนตัวเองถ้าฉันลืมเสียบ pendrive เข้ากับเครื่อง

อย่างไรก็ตามวิธีแก้ปัญหาทั้งหมดที่ฉันพบยังไม่เพียงพอสำหรับฉัน:

  • คำถามที่คล้ายกันนี้แนะนำให้แก้ไข/etc/gdm/PostSession/Defaultไฟล์ แต่ฉันไม่มีสิทธิ์ทำเช่นนั้น (และในขณะนี้ไฟล์นั้นว่างเปล่าในเครื่องของฉันดังนั้นจึงไม่มีตะขอที่มีอยู่เพื่อใช้ประโยชน์)

  • ฉันยังพบโพสต์นี้แนะนำวิธีแก้ปัญหา แต่ตามคำตอบแรกมันไม่ทำงานถ้าฉันปิดคอมพิวเตอร์แทนการออกจากระบบเท่านั้น


คำตอบ:


7

ขณะที่คุณใช้ Gnome คุณสามารถใช้สคริปต์ Python ด้านล่างซึ่งดัดแปลงมาจากสคริปต์ที่คุณกล่าวถึง

จำเป็นต้องมีการออกจากระบบ Gnome (เช่นgnome-session-quit) (หรือปิดระบบ Gnome) ซึ่งเกิดขึ้นเมื่อเราใช้ออกจากระบบใน GUI AFAIK กระบวนการที่ไม่สามารถป้องกันการปิดโดยคำสั่งหรือโดยการsudo shutdown -h 0 sudo poweroffเมื่อshutdownถูกดำเนินการมันจะให้ SIGTERM กับกระบวนการทั้งหมดและให้เวลาไม่กี่วินาทีในการออก (หลังจากดำเนินการสคริปต์บางตัวซึ่งไม่สามารถแก้ไขได้โดยผู้ใช้ที่ไม่ใช่รูท) หากไม่ได้ออกจากกระบวนการจะถูกฆ่าโดย SIGKILL

นี่คือขั้นตอนตามขั้นตอนของgnome_save_yourselfวิธีการ มาทำแบบทดสอบกัน

  1. บันทึกรหัสต่อไปนี้เป็น~/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() 
    
  2. ทำให้ปฏิบัติการได้:

    chmod +x ~/Desktop/execute_script_on_shutdown.sh
    
  3. บันทึกต่อไปนี้เป็น ~/Desktop/shutdown_script.sh

    #!/usr/bin/bash
    touch ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA  
    
  4. ดำเนินการสคริปต์หลัก

    bash ~/Desktop/execute_script_on_shutdown.sh
    

ตอนนี้คุณรู้สึกว่าสคริปต์รออะไรบางอย่าง

  1. ออกจากระบบหรือปิดระบบปฏิบัติการของคุณ (Ubuntu)
  2. เข้าสู่ระบบ
  3. ตรวจสอบไฟล์ที่ชื่อAAAAAAAAAAAAAAAAAAAAAAAAAAAบนเดสก์ท็อปของคุณ

    ls -l ~/Desktop/AAAAAAAAAAAAAAAAAAAAAAAAAAA
    

หากคุณเห็นไฟล์ทุกอย่างตกลง ตอนนี้คุณสามารถแก้ไขshutdown_script.shเพื่อให้เหมาะกับความต้องการของคุณ นอกจากนี้อย่าลืมเรียกใช้งานการexecute_script_on_shutdown.shลงชื่อเข้าใช้ด้วย


1

หากคุณต้องการให้เซสชันของคุณบล็อกภายใต้สถานการณ์ทั้งหมดคุณต้องมีสิทธิ์ใช้รูท ไม่มีทางรอบนั้น ผู้ใช้รูทสามารถkill -9ดำเนินกระบวนการของคุณได้เสมอ ฉันประหลาดใจที่การปิดเครื่องไม่ทำให้ gnome ปล่อยสัญญาณ "ประหยัดตัวเอง" ฉันเชื่อว่าสคริปต์ "PostSession" นั้นจะทำงานหลังจาก gnome-session สิ้นสุดลงและ (ฉันเชื่อ) ก่อนที่ Xserver จะยุติซึ่งหมายความว่าไม่ใช่สถานที่ที่คุณต้องการเตือนว่าควรแสดงบนหน้าจอ (ถ้า ฉันถูกต้อง)

สิ่งที่อาจใช้งานได้คือแอปพลิเคชัน Gnome ที่ a) ตอบสนองต่อเหตุการณ์ gnome "บันทึกด้วยตัวเอง" และ b) ตอบสนองกับ SIGTERM ในลักษณะเดียวกับที่ทำปฏิกิริยากับ "safe-yourself" นอกเหนือจากนั้นมีสิ่งเล็ก ๆ น้อย ๆ ที่คุณสามารถทำได้โดยเฉพาะอย่างยิ่งโดยไม่มีสิทธิ์รูท

อย่างไรก็ตามคุณสามารถแก้ปัญหาที่ไม่ใช่รูทได้: เขียนสคริปต์ PostSession ที่ทำในสิ่งที่คุณต้องการและแนะนำให้ใครบางคนที่มีสิทธิ์รูทในการปรับใช้กับเครื่องทั้งหมดเนื่องจากเป็นเครื่องมือที่มีเหตุผลที่ช่วยให้ผู้ใช้จำนวนมาก โดยปกติแล้วคนที่มีสิทธิ์รูทจะได้รับเงินเพื่อให้ / รักษาผู้ใช้ให้มีความสุข :-)

ปัญหาที่คุณพยายามแก้ไขคืออะไร ทำไมคุณไม่ออกจากเซสชันของคุณเมื่อเสียบ pendrive

คุณสามารถมีไคลเอ็นต์ dbus ที่แสดง "อย่าลืมถอดปลั๊กอุปกรณ์!" เมื่อ gvfs ประกาศถอนการติดตั้งระบบไฟล์บนอุปกรณ์ USB แต่ฉันไม่รู้ว่ามันใช้งานได้ดีหรือแม้กระทั่งใช้เพื่อจุดประสงค์ของคุณ


นี่สำหรับบัญชีของฉันที่ห้องปฏิบัติการคอมพิวเตอร์ ถ้าฉันลืมเสียบ pendrive ของฉันเมื่อฉันออกจากระบบฉันสามารถปล่อยให้มันทำงานเมื่อฉันกลับบ้าน นี่คือเหตุผลที่ฉันไม่ได้รับสิทธิ์พิเศษ (และโชคไม่ดีที่ขออะไรสำหรับผู้ดูแลระบบที่นี่เป็นกระบวนการที่มีประสิทธิภาพมาก) ฉันต้องทำอย่างไรเพื่อสร้างลูกค้า dbus เหมือนที่คุณพูด ฉันไม่เคยทำงานกับสิ่งนี้และฉันไม่สามารถหาเอกสารใด ๆ ที่บอกว่าข้อความ gcfs รองรับเมื่อฉันค้นหามัน
hugomg

0

ในที่สุดฉันก็จัดการทดสอบสคริปต์ Python ที่ฉันพูดถึงว่าเป็นตัวเลือกที่สองในคำถามของฉัน แต่กลับกลายเป็นว่ามันไม่ทำงานเมื่อถามว่าจะปิดตัวลงเช่นกันไม่เพียง แต่ในการรีบูต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.