재개 후 및 화면 잠금 해제 후 스크립트를 실행하는 방법


13

Ubuntu 12.04 LTS에서는 일시 중단에서 다시 시작한 후 데스크톱 잠금을 해제 한 후 스크립트를 실행하고 싶습니다. 이들은 내 사용자로 실행하고 내에 액세스해야 $DISPLAY합니다.

특히 저는

  • 버그 985028nm-applet 을 해결하려면 다시 시작 하십시오.
  • 다음을 사용하여 맞춤 알림 표시 notify-send
  • 이 작업을 할 때 아마도 다른 것들

다시 시작하면 스크립트 /etc/pm/sleep.d/가 실행되지만 화면과 사용자 이름을 모르더라도 루트로 실행됩니다. 이 스크립트에서 내 사용자 이름과 export기본값 DISPLAY :0을 하드 코딩하면 작동 할 수 있지만 매우 추악한 해킹처럼 느껴집니다.

~/.config/autostart/xyz.desktop로그인 후 스크립트가 실행되지만 재개 후 화면 잠금을 해제 한 후에는 실행되지 않습니다.

재개 후 화면 잠금을 해제 한 후 스크립트를 실행하는 방법이 있습니까?


사용자 이름을 하드 코딩하지 않으려면 users다른 사용자가 로그인하지 않았다고 가정하여을 사용할 수 있습니다 . 또는 중요하지 않습니다.
Sparhawk

답변:


9

어쨌든 이전 답변에서 사용자 이름을 하드 코딩 해야하는 것처럼 보이므로 누구나 빠른 수정을 원할 경우 /etc/pm/sleep.d에 간단한 스크립트가 있습니다.

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

5

유닉스와 리눅스 사이트에서이 질문은 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 )

(SCREEN_LOCKED 및 SCREEN_UNLOCKED를 수행하려는 조치로 바꾸십시오.)

xrandr 1>/dev/null 2>1잠금 해제에 대한 조치로 사용하면 화면 잠금 해제시 모니터 해상도 / 위치가 올바르게 복원되지 않는 문제가 해결되었습니다 (xrandr가 화면 설정을 다시 읽은 것으로 보입니다). 이 줄을 내 .bash_profile의 백그라운드 작업으로 추가했습니다 (엄밀히 ~ / .config / autostart의 데스크탑 파일보다 낫습니다. 그놈을 시작할 때만 실행되기 때문에).

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-screensaver API에 대한 추가 배경은 이 사이트 및 dbus 모니터 ( 여기) 에서 찾을 수 있습니다 .


1

한 가지 솔루션은 데스크탑에 로그인 할 때 실행되고 dbus 메시지를 포착하는 스크립트입니다. 일시 중단에서 다시 시작한 후 화면이 잠기고 암호를 입력하면 dbus에 잠금 해제 이벤트가 있습니다.

(올바른 트랙을 찾아 주신 Kim SJ에게 감사합니다. ScreenSaver 신호는 없지만 사용할 다른 인터페이스를 찾았습니다)

에서 ~/.config/autostart/, 나는 bash는 스크립트를 시작하는의 .desktop 파일이 있습니다 :

$ 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_monitor모니터 스크립트에서 DBUS 메시지를 읽어 com.canonical.Unity.Session와에 물건을 수행 Unlocked신호 :

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

로그인 할 때 "잠금 해제"신호는 없지만 dbus-monitor시작 시 "NameAcquired"신호 가 있습니다.


0

start-stop-daemon을 사용하여 스크립트를 실행할 수 있습니다. start-stop-daemon은 다른 uid 및 gid로 실행되는 스레드를 포크하여 문제를 해결할 수 있습니다.

해야 할 일은 같은 시스템 PATH에 배치 된 작업 스크립트 /usr/bin를 작성하고에 추가 데몬 스크립트를 작성하는 것입니다 /etc/pm/sleep.d. 일치하는 pm-suspend조치 resume또는 thaw데몬 스크립트는 다음을 통해 작업 스크립트를 커밋합니다.

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

어디 일 ARGs수도 있고 --chuid 1001:1001그냥 있을 수도 있습니다 --user your_username.

그리고 무결성을 위해 데몬 스크립트가 nm-rtvt일시 중단 전에 이름이 지정된 데몬을 중지하도록 할 수도 있습니다.

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

또는 pm-suspend과 같은 일치하는 동작 .suspendhibernate

자세한 내용은 man start-stop-daemon. 그리고 /etc/init.d데몬 스크립트 에는 다른 많은 예제가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.