Cara menjalankan skrip setelah resume dan setelah membuka kunci layar

13

Di Ubuntu 12.04 LTS, saya ingin menjalankan skrip setelah melanjutkan dari penangguhan, dan setelah membuka kunci desktop saya. Ini perlu dijalankan sebagai pengguna saya, dan dengan akses ke saya $DISPLAY.

Secara khusus, saya ingin

  • restart nm-appletuntuk mengatasi bug 985028
  • tampilkan pemberitahuan khusus menggunakan notify-send
  • mungkin hal-hal lain ketika saya membuatnya bekerja

Saat saya melanjutkan, skrip dalam /etc/pm/sleep.d/dijalankan, tetapi skrip dijalankan sebagai root, tanpa sepengetahuan layar dan nama pengguna saya. Mungkin berhasil jika saya membuat hard-code nama pengguna saya dan exportdefault DISPLAY :0di skrip ini, tapi rasanya seperti peretasan yang sangat jelek.

Skrip sedang ~/.config/autostart/xyz.desktopberjalan setelah masuk, tetapi skrip tidak berjalan setelah hanya membuka kunci layar setelah melanjutkan.

Apakah ada cara untuk menjalankan skrip setelah membuka kunci layar setelah resume?

mivk
sumber
Untuk tidak membuat kode nama pengguna, Anda dapat menggunakan users, dengan asumsi bahwa tidak ada orang lain yang login. (Atau tidak masalah)
Sparhawk

Jawaban:

9

Sepertinya Anda harus membuat kode nama pengguna di jawaban sebelumnya, jadi inilah skrip sederhana untuk di /etc/pm/sleep.d jika ada yang mencari perbaikan cepat:

#!/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
aaron-bru
sumber
5

Pertanyaan ini di situs Unix & Linux mendokumentasikan pendekatan alternatif menggunakan pesan dbus:

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 )

(Ganti SCREEN_LOCKED dan SCREEN_UNLOCKED dengan tindakan yang ingin Anda lakukan.)

Menggunakan xrandr 1>/dev/null 2>1sebagai tindakan membuka kunci memperbaiki masalah saya bahwa resolusi / posisi monitor tidak dipulihkan dengan benar pada pembukaan kunci layar (xrandr tampaknya menyebabkan pembacaan ulang pengaturan layar). Saya menambahkan baris ini sebagai tugas latar belakang di .bash_profile saya (mungkin ini lebih baik sebagai file desktop di ~ / .config / autostart, karena itu hanya berjalan ketika Anda memulai gnome):

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 ) &

Latar belakang lebih lanjut pada API gnome-screensaver dapat ditemukan di situs ini , dan pada monitor dbus di sini .

Kim SJ
sumber
1

Salah satu solusinya adalah skrip yang berjalan saat masuk ke desktop, dan yang menangkap pesan dbus. Setelah melanjutkan dari menangguhkan layar terkunci, dan setelah memasukkan kata sandi, ada acara Buka kunci di dbus.

(Terima kasih kepada Kim SJ karena telah menempatkan saya di jalur yang benar. Saya tidak memiliki sinyal ScreenSaver, tetapi menemukan antarmuka lain untuk digunakan).

Di ~/.config/autostart/, saya memiliki file .desktop yang memulai skrip bash:

$ 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

The unlock_monitorScript Monitor membaca pesan dbus dari com.canonical.Unity.Sessiondan melakukan hal-hal di Unlockedsinyal:

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

Saat masuk, tidak ada sinyal "Tidak Terkunci", tetapi ada sinyal "NameAcquired" saat dbus-monitormulai.

mivk
sumber
0

Anda dapat menjalankan skrip menggunakan start-stop-daemon. start-stop-daemon dapat memotong utas berjalan sebagai uid dan gid yang berbeda, karenanya menyelesaikan masalah Anda.

Yang perlu Anda lakukan adalah menulis skrip pekerjaan yang ditempatkan di system PATH like /usr/bin, dan membuat skrip daemon tambahan /etc/pm/sleep.d. pm-suspendTindakan mencocokkan seperti resumeatau thawskrip daemon melakukan skrip pekerjaan melalui

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

di mana ARGsbisa --chuid 1001:1001atau adil --user your_username.

Dan untuk integritas, Anda mungkin ingin skrip daemon menghentikan damon yang dinamai nm-rtvtsebelum ditangguhkan melalui

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

pm-suspendtindakan yang cocok seperti suspendatau hibernate.

Untuk lebih jelasnya man start-stop-daemon,. Dan ada banyak contoh lain dalam /etc/init.dskrip daemon.

funicorn
sumber