thống nhất - làm thế nào để phát hiện nếu màn hình bị khóa?


9

cả hai chỉ hoạt động sau khi màn hình bị khóa bị trống; nhưng đôi khi họ cũng thất bại, vì bất kỳ lý do gì, màn hình không trống ...

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

Tôi cũng đã thử với qdbus:

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

nhưng nó cũng thất bại không kém.

Tôi chỉ thấy rằng người thực sự khóa màn hình là Unity!

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

Câu hỏi liên quan:
/unix/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a- daemon-which-would-be-lắng-nghe-dbus-and-fire-script-on-messa

Câu trả lời:


6

Câu trả lời của Aquarius Power dường như hoạt động khá tốt. Dưới đây là một số bổ sung tôi có thể thực hiện cho giải pháp của mình.

Chỉ truy vấn trạng thái khóa

Nếu bạn chỉ cần một lớp lót để truy vấn trạng thái khóa, thì điều này sẽ đánh giá là đúng nếu bị khóa và sai nếu được mở khóa.

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

Truy vấn trạng thái khóa thời gian theo dõi kể từ lần thay đổi trạng thái cuối cùng

Bây giờ nếu bạn cần theo dõi thời gian màn hình bị khóa, bạn có thể muốn thực hiện một cách tiếp cận khác.

#!/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
}

Về cơ bản, tập lệnh này theo dõi các thay đổi trong trạng thái khóa của màn hình. Khi thay đổi diễn ra, thời gian và trạng thái được đổ vào một tệp. Bạn có thể đọc tệp này theo cách thủ công nếu bạn thích hoặc sử dụng các chức năng tôi đã viết.

Nếu bạn muốn có dấu thời gian thay vì số giây, hãy thử:

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

Đừng quên công -utắc buộc chương trình ngày bỏ qua múi giờ của bạn.


cuối cùng cũng có thể kiểm tra nó, thx! đó là lý do tại sao tôi không muốn chấp nhận câu trả lời của chính mình khi tôi tự trả lời để những điều tốt hơn có thể xuất hiện sau :)
Bảo Bình Sức mạnh

1
Đối với grep -ioP "(true)|(false)", điều này cũng hoạt động:grep -oE "true|false"
wjandrea

5

màn hình thực sự bị khóa bởi Unity và chúng ta cần sử dụng gdbus

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

Điều này sẽ hiển thị khi nó bị khóa như:

/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 ()

Tôi không quen lắm, nhưng làm thế nào để làm điều này mà không cần theo dõi? giống như chỉ truy vấn?
Noitidart

1
lựa chọn duy nhất tôi tìm thấy là theo dõi nó (có thể có một cách để truy vấn, nhưng tôi không thể tìm thấy mặc dù tôi đã thử), tôi đoán đó là vì khoảnh khắc màn hình bị khóa không được lưu trữ ở bất kỳ đâu, vì vậy màn hình sẽ là cách duy nhất để hiển thị khi nó xảy ra.
Sức mạnh Bảo Bình

Ý tôi là, hãy thử, nếu bạn tìm thấy, cho tôi biết hoặc thêm câu trả lời: D
Sức mạnh của Bảo Bình vào

Ah haha ​​ok tôi cố gắng tìm nó không tốt với linux tôi là một anh chàng windows: P tôi chỉ mã hóa một số công cụ os chéo để tìm kiếm trên internet.
Noitidart


2

Tôi đã có một câu hỏi tương tự ở đây

và sự giúp đỡ tôi nhận được tương tự như những gì Aquarius Power đã nói trước đây, ngoại trừ việc nó được bao gồm trong một daemon scrip, có thể chạy trong nền .. Tôi thấy nó rất hữu ích. vì vậy, hãy xem Câu hỏi của tôi và trả lời, và xem điều này cũng giúp bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.