1
以下は、私の問題を示すスクリプトです。 ctrl-cを押すと終了できないということを除いて動作しています。終了しますが、作業中の関数が実行され続け、ps grep kill -9を使用してプロセスを終了しなければなりません。ctrl-cを終了して関数終了bashスクリプトを終了することができません
私はこのスクリプトを試していて、ジョブコントロールからの "Terminated"メッセージを取り除かずに作業機能を単に停止することはできないことを理解しました。ですから、SIGPIPEを捕まえて機能している関数を終了させるのです。ところで、それはSIGPIPEでしか動作しないようですが、SIGINTやINTでは動作しません。理由はわかりません。とにかく、私はctrl-cで中止する方法をまだ見つけていません。
ありがとうございます!
#!/bin/bash
bail_out() { unset work; }
ctrl_c() { bail_out; exit; }
working()
{
trap bail_out SIGPIPE
trap ctrl_c INT
echo -n "`tput sc`"
# a='|/- \'
a='.oOo oOo. Oo.o o.oO'
work=1
while [ "$work" ]; do
for i in $a; do
[ "$work" ] && echo -n "`tput rc`Working... $i"
sleep .1
done
done
}
task()
{
count=0
while [ $count -lt "$1" ]; do
ls -l >/dev/null
sleep .5
count=$((count +1))
done
}
working &
task 10
kill -s SIGPIPE %%
echo "`tput rc`task 10 completed"
working &
f_pid=$!
task 11
kill -s SIGPIPE $f_pid
echo "`tput rc`task 11 completed"
出力:
$ ./working
task 10 completed
task 11 completed
$ ./working
Working... .oOo^C
Working... oOo.
'-TERM'と' - $$ 'フラグを使ってみましたか?あなたの '殺す'コールで?それはプロセスを殺し、それはすべて子どもです.. IE 'kill -TERM - $$' – Zak
また良い情報:https://superuser.com/questions/243460/what-to-do-when-ctrl-c- cant-kill-a-process – Zak
あなたはそれをctrl_c関数に入れることを意味しますか?はい、問題は、ctrl-cを押してもctrl_c関数を処理しないということです。 – Dude