我正在使用一个简单的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
考虑在背景这将轮询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