web-dev-qa-db-ja.com

アプリケーションの終了時にdbusモニタースクリプトを強制終了するにはどうすればよいですか?

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を使用してみましたが、成功しませんでした。

3
Khurshid Alam

問題

... 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-ファイルからスクリプトを開始することです。

2
Jacob Vlijm

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
1