2017-04-21 107 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函數中?是的,但問題似乎是,當按ctr-c時甚至不處理ctrl_c函數。 – Dude

回答

2

我終於得到它。這個問題顯然是,我在後臺運行的函數中捕獲了ctrl-c。將「trap ctrl_c INT」移出「工作」功能並移入主腳本可解決問題。

ctrl_c() { kill %%; exit; } 


trap ctrl_c INT 
working & 
task 10 
kill -s SIGPIPE %% 
echo "`tput rc`task 10 completed"