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 và 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 -u
tắc buộc chương trình ngày bỏ qua múi giờ của bạn.