#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