dbus-цикл мониторинга завершается автоматически

#bash #gnome #dbus

#bash #gnome #dbus

Вопрос:

Я пытаюсь выполнить команду 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 amp;
 

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

Проверяя вывод 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 синтаксическая ошибка

Комментарии:

1. Не запустив ваш код, но лично я бы ввел небольшой режим ожидания внутри цикла.

2. Кстати, внешний цикл также должен быть while true; do etc.

3. Добавьте строку *) echo "`date` Unknown";; в инструкцию case и запустите команду как nohup myprogram.sh </dev/null > $HOME/myprogram.out 2>amp;1 amp; .

Ответ №1:

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

 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>amp;1 amp;
 

Ответ №2:

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