2017-06-12 115 views
0

我有一個簡單的bash腳本來控制Amazon AWS的上傳和下載。上傳和下載工作正常。但有時候,我的網絡連接很差,我想取消AWS活動。但是,當我點擊取消按鈕(zenity進度對話框)時,AWS進程繼續並繼續(幾分鐘)...我可以殺死AWS進程的唯一方法是前往終端並執行「killall -9 aws」bash zenity對話框在取消時不會終止進程

while [ "$repeat" -eq 0 ]; do 
     ... setup code ... 
     aws s3 sync "$dir1" "$dir2" --region us-east-1 --output text --sse --delete | tr '\r' '\n' > "$last_log_file" 
     ... error code analysis 
    done | zenity --progress --title="$title_text" --text="$msg" --pulsate --auto-close 
    killall -9 aws # <=== When I depress zenity 'cancel' ... this code never executes !!! (this code was added for debug) 

我明白,當我壓低取消PB應該殺死進程。有沒有辦法可以強制這種事情發生?

+0

問題是''aws'和'while'循環中的所有其他東西都不知道'zenity'是否關閉,直到他們嘗試寫入stdout。只要他們這樣做,他們會得到一個SIGPIPE,並可能退出 –

+0

嗯..正如你在我的代碼中看到的,我正在捕獲日誌文件中的AWS輸出。每傳輸一個文件(數百個文件),每隔一秒就會定期更新數據。所以我希望AWS在收到SIGPIPE後不到一秒鐘就關閉。我錯過了什麼嗎? – daniel

+0

,因爲你正在寫入文件而不是標準輸出,所以你不會得到一個SIGPIPE。只有當你試圖寫入管道時,你纔會明白,即stdout –

回答

0

感謝Eric的回覆,我現在有一個解決方案。關鍵是要加入「&」在以運行並行過程中zenity命令結束..

done | zenity --progress --title="$title_text" --text="$msg" --pulsate --auto-close & 

然後添加一些代碼來檢測該zenity PID消失了(因爲它是取消)。一旦檢測到zenity PID已經逝去,killall命令用於殺死AWS

一些示例代碼:

zenity_pid="$(pidof zenity)" 
    while [ "$zenity_pid" != '' ]; do 
     echo "$(pidof zenity)" | grep -w "$zenity_pid" 
     if [ "$?" -eq 0 ]; then 
      sleep 2 
     else 
      killall -9 aws 
      zenity_pid='' 
     fi 
    done 
    wait 

AWS返回退出代碼137,這意味着容器接收的SIGKILL信號