Цикл мониторинга dbus завершается автоматически - PullRequest
3 голосов
/ 18 апреля 2019

Я пытаюсь выполнить команду bash при блокировке / разблокировке экрана.

Следуя инструкциям и вопросам StackExchange, я придумал следующий код:

#!/bin/bash
while true; do #added to try to solve the issue, but alas it did not
    dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
    while read sign; do
        case "$sign" in
            *"boolean false"*)  echo "Screen unlocked";;
            *"boolean true"*)   echo "Screen locked";;
        esac
    done
done

Я запускаю программу с помощью следующей команды:

nohup myprogram.sh &

При запуске все работает хорошо, но через некоторое время (несколько часов) эхосигнал исчезает, когда экран заблокирован / разблокирован.

Проверяя вывод ps aux | grep mycommand, я получаю следующий результат при запуске :

user  <pid1> 0.0 0.0 <number> <number> pts/2 S 13:01   0.00 /bin/bash myprogram.sh
user  <pid2> 0.0 0.0 <number> <number> pts/2 S 13:01   0.00 /bin/bash myprogram.sh

После того, как он прервется и больше не будет отправлять сообщения, , тогда вывод ps покажет только одну строку .

Я использую CentOS 6.5 , с Gnome 2.28 (и я, к сожалению, не могу перейти на более новую версию).


Хотели бы вы знать, что может происходить и / или как проводить дальнейшие расследования?


Редактировать: исправлена ​​синтаксическая ошибка while true; then

Ответы [ 2 ]

1 голос
/ 05 мая 2019
#!/bin/bash
while true; do
    dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
    while read -r sign; do
        case "$sign" in
            *"boolean false"*)  echo "Screen unlocked";;
            *"boolean true"*)   echo "Screen locked";;
        esac
    done
done

я изменяю while true; then на while true; do и добавляю опцию -r к while read sign; do

1 голос
/ 03 мая 2019

Следующий скрипт работает для меня на Linux Mint Cinnamon.Обратите внимание на «корицу» вместо «гном»;если вы не уверены в том, что использовать, запустите echo $DESKTOP_SESSION, который должен предоставить вам имя для использования вместо корицы;для меня:

me@localhost ~] echo $DESKTOP_SESSION
cinnamon

Вот сценарий:

#!/bin/bash

while true; do #added to try to solve the issue, but alas it did not
    dbus-monitor --session "type='signal',interface='org.cinnamon.ScreenSaver'" |
    while read sign; do
        case "$sign" in
            *[Ff]alse*) echo "Screen unlocked";;
            *[Tt]rue*)  echo "Screen locked";;
            *)   echo "`date` Unknown";;
        esac
        sleep 0.250
    done
done

Выполнить так:

nohup ./myprogram </dev/null >| $HOME/myprogram.out 2>&1 &
...