gnote
に簡単なdbus-monitor
スクリプトを使用しています。スクリプトは、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
しかし、うまくいきませんでした。この question で説明されているtrap
を使用してみましたが、成功しませんでした。
... dbus-monitorスクリプトは、スクリプトで強制終了されない子プロセス(dbus-monitor
)を実行し、実際にスクリプトを「強制終了不能」にすることです。
ラッパーを使用して、gnote +モニタースクリプトを実行し、gnote
が終了したら、次のコマンドでdbus-monitor
-スクリプトを強制終了します。
pkill -P <pid>
...ここで<pid>
はモニタースクリプトのPIDです(pgrep -f /path/to/script
を使用しました)。これにより、スクリプトおよびの子が強制終了され、正常に終了します。
this answer と書いているのとまったく同じ問題に遭遇しました。
モニタースクリプトが実行可能であると仮定して、次のコマンドでgnote
を実行します。
'/path/to/monitorscript' & gnote && pkill -P "$( pgrep -f '/path/to/monitorscript )"
最も簡単なのは、それをワンライナースクリプトにして、.desktop
-ファイルからスクリプトを開始することです。
pgrep
のpidについてgnote
をポーリングし、PIDがdbus-monitor
を停止する関数backgroundを持つことを検討してください(pkill
で-f
フラグの使用に注意してください)。また、バックグラウンド関数がどのように呼び出されるかに注意してください-stop_monitor &
このような関数を含めるようにスクリプトを修正しました。 Ubuntu 16.04でテストしたgnoteをインストールすると、期待どおりに動作します。
#!/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