2017-04-21 23 views
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. 
+0

'-TERM'と' - $$ 'フラグを使ってみましたか?あなたの '殺す'コールで?それはプロセスを殺し、それはすべて子どもです.. IE 'kill -TERM - $$' – Zak

+0

また良い情報:https://superuser.com/questions/243460/what-to-do-when-ctrl-c- cant-kill-a-process – Zak

+0

あなたはそれをctrl_c関数に入れることを意味しますか?はい、問題は、ctrl-cを押してもctrl_c関数を処理しないということです。 – Dude

答えて

2

私は最終的にそれを得ました。問題は明らかに、バックグラウンドで実行された関数の中にctrl-cをトラップしていたことでした。 「作業中」機能から「トラップctrl_c INT」を移動し、メインスクリプトに問題を解決しました。

ctrl_c() { kill %%; exit; } 


trap ctrl_c INT 
working & 
task 10 
kill -s SIGPIPE %% 
echo "`tput rc`task 10 completed" 
関連する問題