2つのスクリプトがあります。最初は背景にあり、2番目は前景にあります。
trap "ret=\$?; rm -f pipe1 pipe2; exit \$ret" EXIT INT TERM QUIT
my.bin > pipe1 < pipe2 &
my-term.sh pipe1 pipe2
my-term.sh
stdin/stdoutを介してユーザーと対話します(CLIターミナルプログラムに似ています)。
while read -ep "prompt> " l; do echo $l; done
my.bin
exit 0
シミュレートするスクリプトです。
my-term.sh
my.bin
何らかの理由でやめた場合、どうやって終了しますか?
働くもの:
trap "ret=\$?; rm -f pipe1 pipe2; exit \$ret" EXIT INT TERM QUIT
(my.bin > pipe1 < pipe2; kill -9 $$) &
my-term.sh pipe1 pipe2
ただし、my-term.sh
クリーニングが中断される可能性があります。正しいことは何ですか?
答え1
一連のシグナルを試し、1つが失敗した場合は、3秒待ってから(睡眠時間は何をすべきかmy-term.sh
によって調整できます)、別のシグナルを試してください。
(my.bin > pipe1 < pipe2; x=$$ ; \
for sig in SIGTERM SIGINT SIGQUIT SIGABRT SIGKILL ; \
do kill -${sig} $x && break ; sleep 3s ; done ; ) &
my-term.sh pipe1 pipe2