วิธีเรียกใช้สคริปต์หลังจากทำงานต่อและหลังจากปลดล็อคหน้าจอ


14

ใน Ubuntu 12.04 LTS ฉันต้องการเรียกใช้สคริปต์หลังจากทำงานต่อจากการหยุดชั่วคราวและหลังจากปลดล็อกเดสก์ท็อปของฉัน $DISPLAYความต้องการเหล่านี้จะทำงานเป็นผู้ใช้ของฉันและมีการเข้าถึงของฉัน

โดยเฉพาะอย่างยิ่งฉันต้องการ

  • รีสตาร์ทnm-appletเพื่อแก้ไขข้อผิดพลาด 985028
  • แสดงการแจ้งเตือนที่กำหนดเองโดยใช้ notify-send
  • อาจเป็นสิ่งอื่นเมื่อฉันทำงานเหล่านี้

เมื่อฉันกลับมาทำงานสคริปต์ใน/etc/pm/sleep.d/จะทำงาน แต่พวกเขาทำงานเป็นรากโดยไม่ต้องรู้หน้าจอและชื่อผู้ใช้ของฉัน อาจทำงานได้หากฉันกำหนดรหัสชื่อผู้ใช้และexportค่าเริ่มต้นDISPLAY :0ในสคริปต์เหล่านี้ แต่ก็รู้สึกว่าแฮ็คน่าเกลียดมาก

สคริปต์~/.config/autostart/xyz.desktopทำงานหลังจากเข้าสู่ระบบ แต่จะไม่ทำงานหลังจากปลดล็อคหน้าจอหลังจากทำงานต่อ

มีวิธีเรียกใช้สคริปต์หลังจากปลดล็อกหน้าจอหลังจากทำงานต่อหรือไม่?


รหัสไม่ยากชื่อผู้ใช้ที่คุณสามารถใช้usersสมมติว่าไม่มีใครถูกบันทึกไว้ใน (หรือมันไม่สำคัญ).
สปาร์

คำตอบ:


9

ดูเหมือนว่าคุณจะต้องใช้รหัสชื่อผู้ใช้ในคำตอบก่อนหน้านี้อย่างหนักดังนั้นนี่เป็นสคริปต์ง่าย ๆ สำหรับใน /etc/pm/sleep.d หากใครที่กำลังมองหาการแก้ไขอย่างรวดเร็ว:

#!/bin/bash 
case "$1" in
    hibernate|suspend)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on suspend"
        ;;
    thaw|resume)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on resume"
        ;;
esac

6

คำถามที่ไซต์ Unix & Linuxจัดทำเอกสารทางเลือกโดยใช้ข้อความ dbus

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean true" &> /dev/null; then SCREEN_LOCKED; elif echo $X | grep "boolean false" &> /dev/null; then SCREEN_UNLOCKED; fi done )

(แทนที่ SCREEN_LOCKED และ SCREEN_UNLOCKED ด้วยการกระทำที่คุณต้องการดำเนินการ)

การใช้xrandr 1>/dev/null 2>1เป็นการกระทำในการปลดล็อคแก้ไขปัญหาของฉันที่ความละเอียด / ตำแหน่งของจอภาพไม่ได้รับการกู้คืนอย่างถูกต้องในการปลดล็อกหน้าจอ (xrandr ดูเหมือนจะทำให้เกิดการอ่านการตั้งค่าหน้าจออีกครั้ง) ฉันเพิ่มบรรทัดนี้เป็นงานพื้นหลังใน. bash_profile ของฉัน (อย่างเคร่งครัดมันอาจจะดีกว่าในฐานะไฟล์เดสก์ท็อปใน ~ / .config / autostart เนื่องจากจะทำงานเมื่อคุณเริ่ม gnome เท่านั้น):

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean false" &> /dev/null; then xrandr 1>/dev/null 2>1; fi done ) &

พื้นหลังเพิ่มเติมเกี่ยวกับ gnome-สกรีนเซฟเวอร์ API สามารถพบได้ที่เว็บไซต์นี้และบนจอภาพ dbus ที่นี่


1

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

(ขอบคุณ Kim SJ ที่ให้ฉันไปในทิศทางที่ถูกต้องฉันไม่มีสัญญาณ ScreenSaver แต่พบว่ามีอินเตอร์เฟสอื่นให้ใช้)

ใน~/.config/autostart/ฉันมีไฟล์ .desktop ซึ่งเริ่มสคริปต์ทุบตี:

$ cat ~/.config/autostart/mymonitor.desktop
[Desktop Entry]
Categories=System;Monitor;
Comment=Monitor dbus for unlock signals
Exec=/usr/local/bin/unlock_monitor
Name=unlock_monitor
Type=Application

unlock_monitorสคริปต์จอภาพอ่านข้อความจาก dbus com.canonical.Unity.Sessionและไม่สิ่งที่อยู่บนUnlockedสัญญาณ:

#!/bin/bash

dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session" --profile \
| while read dbusmsg; do
    if [[ "$dbusmsg" =~ Unlocked$ || "$dbusmsg" =~ NameAcquired$ ]] ; then
        sleep 5
        notify-send "$(basename $0)" "Unlocked or freshly logged in..."
        # ...
    fi
done

เมื่อเข้าสู่ระบบจะไม่มีสัญญาณ "ปลดล็อค" แต่จะมีสัญญาณ "NameAcquired" เมื่อdbus-monitorเริ่มต้น


0

คุณสามารถเรียกใช้สคริปต์โดยใช้ start-stop-daemon start-stop-daemon สามารถแยกเธรดที่รันเป็น uid และ gid ที่แตกต่างกันดังนั้นการแก้ปัญหาของคุณ

สิ่งที่คุณต้องทำคือการเขียนสคริปต์งานที่อยู่ในเส้นทางของระบบเช่น/usr/binและเพื่อสร้างสคริปต์ daemon /etc/pm/sleep.dเพิ่มเติม การจับคู่pm-suspendแอ็คชันเช่นresumeหรือthawสคริปต์ daemon ส่งสคริปต์งานผ่าน

start-stop-daemon --start $ARGs --name nm-rtvt--exec /usr/bin/job_script

ที่ARGsอาจจะหรือเพียงแค่--chuid 1001:1001--user your_username

และเพื่อความถูกต้องคุณอาจต้องการให้ daemon สคริปต์หยุดการทำงานของ damon ที่มีชื่อnm-rtvtก่อนที่จะหยุดการทำงานชั่วคราว

start-stop-daemon --stop <...>

ที่ตรงกับpm-suspendการกระทำเช่นหรือsuspendhibernate

สำหรับรายละเอียด, man start-stop-daemon. และมีอีกหลายตัวอย่างใน/etc/init.dสคริปต์ daemon

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