ความสามัคคี - วิธีการตรวจสอบว่าหน้าจอถูกล็อค?


9

ทั้งสองนี้ทำงานหลังจากหน้าจอที่ถูกล็อคว่างเปล่า แต่บางครั้งพวกเขาก็ล้มเหลวด้วยเหตุผลใดก็ตามที่หน้าจอไม่ว่าง ...

gnome-screensaver-command --query
gnome-screensaver-command --time

ฉันลองด้วยqdbus:

qdbus org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActiveTime

แต่มันก็ล้มเหลวอย่างเท่าเทียมกัน

ฉันเพิ่งพบว่าใครเป็นผู้ล็อคหน้าจอจริง ๆ คือ Unity!

qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.Lock

คำถามที่เกี่ยวข้อง:
/unix/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a- ภูตซึ่ง-จะเป็นฟังการ dbus และไฟสคริปต์-on-Messa

คำตอบ:


6

คำตอบของกุมภ์ดูเหมือนจะทำงานได้ค่อนข้างดี นี่คือบางส่วนเพิ่มเติมที่ฉันอาจทำเพื่อแก้ปัญหาของเขา

สอบถามสถานะล็อคเท่านั้น

หากคุณต้องการเพียงหนึ่งซับเพื่อสืบค้นสถานะการล็อคสิ่งนี้ควรประเมินว่าเป็นจริงหากถูกล็อคและเท็จหากปลดล็อก

isLocked=$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")

การล็อคสถานะการสืบค้นและเวลาติดตามตั้งแต่เปลี่ยนสถานะครั้งล่าสุด

ทีนี้ถ้าคุณต้องการติดตามว่าหน้าจอถูกล็อคนานแค่ไหนคุณอาจต้องใช้วิธีอื่น

#!/bin/bash
# To implement this, you can put this at the top of a bash script or you can run
# it the subshell in a separate process and pull the functions into other scripts.

# We need a file to keep track of variable inside subshell the file will contain
# two elements, the state and timestamp of time changed, separated by a tab.
# A timestamp of 0 indicates that the state has not changed since we started
# polling for changes and therefore, the time lapsed in the current state is
# unknown.
vars="/tmp/lock-state"

# start watching the screen lock state
(
    # set the initial value for lock state
    [ "$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")" == "true" ] && state="locked" || state="unlocked"
    printf "%s\t%d" $state 0 > "$vars"

    # start watching changes in state
    gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session | while read line
    do 
        state=$(grep -ioP "((un)?locked)" <<< "$line")
        # If the line read denotes a change in state, save it to a file with timestamp for access outside this subshell
        [ "$state" != "" ] && printf "%s\t%d" ${state,,} $(date +%s)> "$vars"
    done
) & # don't wait for this subshell to finish

# Get the current state from the vars exported in the subshell
function getState {
    echo $(cut -f1 "$vars")
}

# Get the time in seconds that has passed since the state last changed
function getSecondsElapsed {
    if [ $(cut -f2 "$vars") -ne 0 ]; then
        echo $(($(date +%s)-$(cut -f2 "$vars")))
    else
        echo "unknown"
    fi
}

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

หากคุณต้องการบันทึกเวลาแทนที่จะเป็นจำนวนวินาทีลอง:

date -ud @$(getSecondsElapsed) | grep -oP "(\d{2}:){2}\d{2}"

อย่าลืม-uสวิตช์ที่บังคับให้โปรแกรมวันที่ละเว้นเขตเวลาของคุณ


ในที่สุดก็สามารถทดสอบได้ขอบคุณ! นั่นเป็นเหตุผลว่าทำไมฉันถึงไม่ยอมรับคำตอบของฉันเองเมื่อฉันตอบตัวเองดังนั้นสิ่งที่ดีกว่าอาจจะออกมาในภายหลัง :)
Aquarius Power

1
สำหรับgrep -ioP "(true)|(false)"สิ่งนี้ยังใช้งานได้:grep -oE "true|false"
wjandrea

5

หน้าจอถูกล็อคโดย Unity และเราจำเป็นต้องใช้ gdbus

gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session

สิ่งนี้จะแสดงเมื่อถูกล็อคเช่น:

/com/canonical/Unity/Session: com.canonical.Unity.Session.LockRequested ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.Locked ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.UnlockRequested ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.Unlocked ()

ฉันไม่ค่อยคุ้นเคย แต่จะทำอย่างไรถ้าไม่มีการตรวจสอบ? เช่นเดียวกับการสอบถาม?
Noitidart

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

ฉันหมายถึงลองด้วยถ้าคุณพบบอกฉันหรือเพิ่มคำตอบ: D
Aquarius Power

อ้าฮ่าฮ่าโอเคไม่ได้ลองหามันไม่ดีกับ linux im a windows guy: P im แค่เขียนโค้ดข้ามสิ่งต่าง ๆ เพื่อค้นหาในอินเทอร์เน็ต
Noitidart


2

ฉันมีคำถามที่คล้ายกันที่นี่

และความช่วยเหลือที่ฉันได้รับนั้นคล้ายกับสิ่งที่ Aquarius Power กล่าวไว้ก่อนหน้ายกเว้นว่ามันรวมอยู่ใน bash scrip daemon ที่สามารถทำงานในพื้นหลัง .. ฉันพบว่ามีประโยชน์มาก ลองดูที่คำถามและคำตอบและดูว่าสิ่งนี้จะช่วยคุณได้หรือไม่

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