Como posso matar um script do monitor dbus quando um aplicativo sai?

3

Estou usando um script dbus-monitor simples para gnote . O script começa quando gnote é iniciado. Eu modifiquei Exec= -line do arquivo .desktop para conseguir isso.

O problema é que não encontrei nenhuma maneira de matar meu script depois que a aplicação (ou seja, gnote ) é encerrada. Se o próprio aplicativo sair, não faz sentido manter o script em execução em segundo plano, pois ele não irá buscar nenhuma saída.

O script é assim:

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

Eu tentei modificá-lo assim:

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

Mas não funcionou. Eu também tentei usar trap conforme explicado nesta pergunta mas sem sucesso.

    
por Khurshid Alam 06.09.2016 / 20:55

2 respostas

2

O problema

... é que seu script dbus-monitor executa um processo-filho ( dbus-monitor ) que não é eliminado com o script, tornando o script "inutilizável".

O que fazer

O que você precisa fazer é usar um wrapper, executando o gnote + o script do monitor, e quando gnote terminar, mate o script dbus-monitor - pelo comando:

pkill -P <pid>

... onde <pid> é o pid do seu script de monitor (usei pgrep -f /path/to/script ). Isso matará o script e seus filhos, finalizando-o com sucesso.

Eu encontrei exatamente o mesmo problema escrevendo esta resposta .

O wrapper

Assumindo que seu script de monitor é executável, execute gnote pelo comando:

'/path/to/monitorscript' & gnote && pkill -P "$( pgrep -f '/path/to/monitorscript )"

O mais fácil é torná-lo um script de uma linha e iniciar o script a partir do seu .desktop -file

    
por Jacob Vlijm 06.09.2016 / 21:43
1

Considere ter uma função em plano de fundo que pesquise pgrep para% p_de% e depois que o PID pare a gnote (observe o uso de dbus-monitor flag com -f ). Além disso, observe como a função de segundo plano é chamada - pkill

Eu modifiquei seu script para incluir essa função. Nota instalada, testada no Ubuntu 16.04, funciona como esperado.

#!/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
    
por Sergiy Kolodyazhnyy 06.09.2016 / 23:12