当应用程序退出时,如何终止 dbus 监视脚本?

当应用程序退出时,如何终止 dbus 监视脚本?

我正在使用一个简单的dbus-monitor脚本gnote。该脚本在gnote启动时启动。我修改了文件Exec=的行.desktop以实现这一点。

问题是我没有找到任何方法来终止应用程序后的脚本(即格诺特) 退出。如果应用程序本身退出,则没有必要让脚本在后台运行,因为它不会获取任何输出。

脚本如下:

#!/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本文中解释的方法问题但没有成功。

答案1

问题

...是您的 dbus 监视脚本运行了一个子进程(dbus-monitor),该进程不会被脚本杀死,实际上使得脚本“无法被杀死”。

该怎么办

您需要做的是使用包装器,运行 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

考虑在背景这将轮询pgrepgnotepid,一旦 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

相关内容