birlik - ekranın kilitli olup olmadığını nasıl tespit edebilirim?


9

her ikisi de sadece kilitli ekran karartıldıktan sonra çalışır; ancak bazen de başarısız olurlar, herhangi bir nedenle ekran kararmazsa ...

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

Ben de denedim qdbus:

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

ama aynı derecede başarısız oldu.

Sadece ekranı kilitleyenlerin Birlik olduğunu gördüm!

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

İlgili sorular:
/unix/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a- cin -ki-olurdu-dinleme-to-dbus-ve-ateş-komut-on-messa

Yanıtlar:


6

Kova Gücü'nün cevabı gayet iyi çalışıyor. İşte onun çözümüne yapabileceğim bazı eklemeler.

Yalnızca kilit durumunu sorgulama

Kilit durumunu sorgulamak için yalnızca bir astar gerekiyorsa, bu kilitli olduğunda true olarak ve kilitli değilse false olarak değerlendirilmelidir.

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

Durumdaki son değişiklikten bu yana kilit durumunu ve parça süresini sorgulama

Şimdi ekranın ne kadar süre kilitlendiğini takip etmeniz gerekiyorsa farklı bir yaklaşım izlemek isteyebilirsiniz.

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

Esasen, bu komut dosyası ekranın kilit durumundaki değişiklikleri izler. Değişiklikler yapıldığında, saat ve durum bir dosyaya dökülür. Yazdığım işlevleri isterseniz bu dosyayı manuel olarak okuyabilir veya kullanabilirsiniz.

Saniye yerine zaman damgası istiyorsanız şunu deneyin:

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

-uTarih programını saat diliminizi görmezden gelmeye zorlayan anahtarı unutmayın .


sonunda test edebilirsin, thx! bu yüzden kendime cevap verdiğimde kendi cevabımı kabul etmemeyi seviyorum, bu yüzden daha iyi şeyler daha sonra ortaya çıkabilir :)
Aquarius Power

1
İçin grep -ioP "(true)|(false)", bu da işe grep -oE "true|false"
yarar

5

ekran aslında Unity tarafından kilitlendi ve gdbus

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

bu kilitlendiğinde gösterecektir:

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

Çok tanıdık değilim, ama bunu izleme olmadan nasıl yapabilirim? sadece sorgulama gibi mi?
Noitidart

1
Bulduğum tek seçenek onu izlemeye devam etmekti (sadece sorgulamanın bir yolu olabilir, ama denememe rağmen bulamadım), sanırım bunun nedeni ekranın kilitlendiği anın herhangi bir yerde saklanmaması, böylece monitör ne zaman olduğunu göstermenin tek yolu ol.
Kova Gücü

Yani, siz de deneyin, bulursanız, söyleyin veya bir cevap ekleyin: D
Aquarius Power

Ah haha ​​ok hasta linux im bir windows adam im iyi bulmaya çalışın: P im sadece internet arama bazı çapraz os şeyler kodlama.
Noitidart


2

Burada benzer bir sorum vardı

ve aldığım yardım, Kova Gücü'nün daha önce söylediklerine benziyordu, ancak arka planda çalışabilen bir bash senaryosuna dahil edildi. Çok yararlı buldum. öyleyse, Soruma bir göz atın ve yanıtlayın ve bunun size yardımcı olup olmadığını görün.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.