Я использую простое dbus-monitor
сценарий для gnote
. Сценарий запускается когда gnote
запускается. Я изменил Exec=
- строка .desktop
файл для достижения этого.
Проблема состоит в том, что я не нашел способа уничтожить мой сценарий после приложения (т.е. gnote) выходы. Если само приложение выходит нет никакого смысла поддерживать сценарий в рабочем состоянии в фоновом режиме, поскольку это не собирается выбирать любой вывод.
Сценарий похож на это:
#!/bin/bash
OJECT="'org.gnome.Gnote'"
IFACE="'org.gnome.Gnote.RemoteControl'"
DPATH="'/org/gnome/Gnote/RemoteControl'"
echo $IFACE
WATCH1="type='signal',sender=${OJECT},interface=${IFACE},path=${DPATH},member='NoteAdded'"
WATCH2="type='signal',sender=${OJECT},interface=${IFACE},path=${DPATH},member='NoteSaved'"
WATCH3="type='signal', sender=${OJECT}, interface=${IFACE}, path=${DPATH}, member='NoteDeleted'"
dbus-monitor ${WATCH2} |
while read LINE; do
echo $LINE | grep "note://"
done
Я пытался изменить его как это:
dbus-monitor ${WATCH2} |
while read LINE; do
echo $LINE | grep "note://"
if pgrep "gnote" > /dev/null; then
echo ""
else
break;
fi
done
pid=`pidof -x $(basename $0)`
kill $pid
Но это не работало. Я также пытался использовать trap
как объяснено в этом вопросе, но без успеха.
... - то, что Ваш сценарий монитора dbus-выполняет дочерний процесс (dbus-monitor
), который не уничтожается со сценарием, на самом деле делая сценарий "не-killable".
, Что необходимо сделать, использовать обертку, работая gnote + сценарий монитора, затем когда gnote
концы, уничтожьте dbus-monitor
- сценарий командой:
pkill -P <pid>
..., где <pid>
pid Вашего сценария монитора (я использовал pgrep -f /path/to/script
). Это уничтожит сценарий и его дети, завершая его успешно.
я столкнулся точно с той же проблемой, пишущий этот ответ .
Принятие Вашего сценария монитора исполняемо, работайте gnote
командой:
'/path/to/monitorscript' & gnote && pkill -P "$( pgrep -f '/path/to/monitorscript )"
самое легкое должно сделать его одним - сценарий лайнера и запустить сценарий с Вашего .desktop
- файл
Рассмотрите наличие функции в фон , который опросит pgrep
относительно gnote
pid, и однажды остановка PID dbus-monitor
(отметьте использование -f
флаг с pkill
). Кроме того, заметьте, как фоновая функция вызвана - stop_monitor &
я изменил Ваш сценарий для включения такой функции. Установленный gnote, протестированный на Ubuntu 16.04, работает как ожидалось.
#!/bin/bash
stop_monitor()
{
while pgrep "gnote" > /dev/null
do
:
done
pkill -f "dbus-monitor"
}
OJECT="'org.gnome.Gnote'"
IFACE="'org.gnome.Gnote.RemoteControl'"
DPATH="'/org/gnome/Gnote/RemoteControl'"
echo $IFACE
WATCH1="type='signal',sender=${OJECT},interface=${IFACE},path=${DPATH},member='NoteAdded'"
WATCH2="type='signal',sender=${OJECT},interface=${IFACE},path=${DPATH},member='NoteSaved'"
WATCH3="type='signal', sender=${OJECT}, interface=${IFACE}, path=${DPATH}, member='NoteDeleted'"
stop_monitor &
dbus-monitor ${WATCH2} |
while read LINE;
do
echo $LINE | grep "note://"
done