Sürdürme işleminden sonra ve ekran kilidini açtıktan sonra komut dosyası nasıl çalıştırılır


14

Ubuntu 12.04 LTS'de, askıya alma işleminden devam ettikten sonra ve masaüstümün kilidini açtıktan sonra komut dosyalarını çalıştırmak istiyorum. Bunlar benim kullanıcı olarak ve benim erişimi ile çalıştırmak gerekir $DISPLAY.

Özellikle,

  • 985028 hatanm-applet çalışmak için yeniden başlatın
  • kullanarak özel bir bildirim göster notify-send
  • Bunları çalıştırdığımda muhtemelen diğer şeyler

Devam ettiğimde, komut dosyaları /etc/pm/sleep.d/çalıştırılır, ancak ekranım ve kullanıcı adım bilgisi olmadan kök olarak çalışırlar. Bu komut dosyalarında kullanıcı adımı ve exportvarsayılanı zor kodlarsam işe yarayabilir DISPLAY :0, ancak bu çok çirkin bir kesmek gibi geliyor.

Komut dosyaları ~/.config/autostart/xyz.desktopoturum açtıktan sonra çalışır, ancak devam ettikten sonra yalnızca ekran kilidini açtıktan sonra çalışmazlar.

Devam ettirildikten sonra ekran kilidini açtıktan sonra komut dosyalarını çalıştırmanın bir yolu var mı?


Kullanıcı adını sabit kodlamamak için, usersbaşka hiç kimsenin oturum açmadığını varsayarak kullanabilirsiniz . (Veya önemli değil)
Sparhawk

Yanıtlar:


9

Görünüşe göre önceki yanıtta kullanıcı adını sabit olarak kodlamanız gerekiyor gibi görünüyor, bu yüzden hızlı bir düzeltme arayan /etc/pm/sleep.d için basit bir komut dosyası:

#!/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 ve Linux sitesindeki bu soru, dbus mesajlarını kullanarak alternatif bir yaklaşımı belgeliyor:

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 ve SCREEN_UNLOCKED ifadelerini yerine getirmek istediğiniz eylemlerle değiştirin.)

xrandr 1>/dev/null 2>1Kilit açma eylemini kullanarak , ekran kilidini açmada ekran çözünürlüklerinin (konumların yeniden okunmasına neden olduğu görülüyor) monitör çözünürlüklerinin / konumlarının doğru şekilde geri yüklenmemesi sorunumu düzeltti. Bu satırı, .bash_profile dosyamda bir arka plan görevi olarak ekledim (kesinlikle gnome'u başlattığınızda çalıştığından ~ / .config / autostart içinde bir masaüstü dosyası olarak daha iyi olabilir):

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-ekran API ile ilgili diğer arka plan bulunabilir bu site ve dbus üzerinde izlemek buraya .


1

Bir çözüm, masaüstüne giriş yaparken çalışan ve dbus mesajlarını yakalayan bir komut dosyasıdır. Askıya alma işleminden sonra ekran kilitlenir ve parolayı girdikten sonra dbus'ta bir Kilit Aç olayı olur.

(Beni doğru yola koyduğu için Kim SJ'ye teşekkürler. ScreenSaver sinyalim yok, ancak kullanmak için başka bir arayüz buldum).

İçinde ~/.config/autostart/, bir bash betiği başlatan bir .desktop dosyası var:

$ 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_monitorMonitör komut gelen dbus iletilerini okur com.canonical.Unity.Sessionve üzerinde şeyler yapar Unlockedsinyaller:

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

Oturum açarken, "Kilidi Açıldı" sinyali yok, ancak dbus-monitorbaşlatıldığında bir "NameAcquired" sinyali var .


0

Start-stop-daemon kullanarak bir komut dosyası çalıştırabilirsiniz. start-stop-daemon farklı uid ve gid olarak çalışan ipliği çatallayabilir, böylece probleminizi çözebilir.

Yapmanız gereken PATH sistemine benzer bir iş komut dosyası yazmak /usr/binve içinde ekstra bir daemon komut dosyası oluşturmaktır /etc/pm/sleep.d. Veya daemon komut dosyası pm-suspendgibi eşleme işlemi , iş komut dosyasınıresumethaw

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

nerede ARGsolabilir --chuid 1001:1001ya da sadece --user your_username.

Ve bütünlük için, daemon komut dosyasının, nm-rtvtaracılığıyla askıya alınmadan önce adlandırılan damon'u durdurmasını da isteyebilirsiniz

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

veya pm-suspendgibi eylemler eşleştirme .suspendhibernate

Ayrıntılar için man start-stop-daemon. Ve /etc/init.ddaemon senaryolarında başka örnekler de var .

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.