Как я могу уничтожить сценарий монитора dbus, когда приложение выходит?

Я использую простое 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 как объяснено в этом вопросе, но без успеха.

3
задан 23 May 2017 в 15:39

2 ответа

Выпуск

... - то, что Ваш сценарий монитора 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 - файл

2
ответ дан 1 December 2019 в 16:21

Рассмотрите наличие функции в фон , который опросит 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
1
ответ дан 1 December 2019 в 16:21

Другие вопросы по тегам:

Похожие вопросы: