誰かがこれを手伝ってくれるのだろうか?
私はbashスクリプトを持っています。別の GUI ベースのアプリケーションであるサブプロセスを開始します。次に、bash スクリプトはインタラクティブ モードになり、ユーザーからの入力を取得します。この対話モードは無期限に続きます。サブプロセスの gui アプリケーションが終了したときに終了させたいと思います。
SIGCHLD を見てきましたが、これは答えではないようです。これが私が試したことですが、プログラムが終了したときに信号が届きません。
set -o monitor
"${prog}" &
prog_pid=$!
function check_pid {
kill -0 $1 2> /dev/null
}
function cleanup {
### does cleanup stuff here
exit
}
function sigchld {
check_pid $prog_pid
[[ $? == 1 ]] && cleanup
}
trap sigchld SIGCHLD
次の回答を更新しました。「nosid」からの提案を使用して、これが機能するようになりました。関連するもう 1 つの問題があります。これは、次のインタラクティブなプロセスが、ユーザーからのキー入力の待機をブロックする基本的なメニュー駆動型のプロセスであるということです。子プロセスが終了すると、入力が受信されるまで USR1 シグナルは処理されません。シグナルを強制的にすぐに処理する方法はありますか?
待機の様子は次のようになります。
stty raw # set the tty driver to raw mode
max=$1 # maximum valid choice
choice=$(expr $max + 1) # invalid choice
while [[ $choice -gt $max ]]; do
choice=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
done
stty sane # restore tty
ソリューションで更新されました。私はこれを解決しました。その秘訣は、読み取りにノンブロッキング I/O を使用することでした。今、「nosid」からの回答と私の修正により、私はまさに私が望むものを手に入れました。完全を期すために、これが私にとってうまくいくものです:
#!/bin/bash -bm
{
"${1}"
kill -USR1 $$
} &
function cleanup {
# cleanup stuff
exit
}
trap cleanup SIGUSR1
while true ; do
stty raw # set the tty driver to raw mode
max=9 # maximum valid choice
while [[ $choice -gt $max || -z $choice ]]; do
choice=`dd iflag=nonblock if=/dev/tty bs=1 count=1 2>/dev/null`
done
stty sane # restore tty
# process choice
done