"control-c"を検出したり、bashスクリプトで失敗したコード

長いプロセスを自動化するためにbashスクリプトを作成しました。良い結果。

ただし、sshの切断によってユーザーがcontrol-cを押すか再実行する必要がある場合は、ps -ef | grep myprogramを実行すると、前の実行の残りの部分がまだ実行されていることがわかりました。

問題は、ユーザーに回転する進行状況バーを表示できるように、各ステップの背景を設定するこのコードにあると思います。

<snippet begin>
function progress {
 SPIN='-\|/'
 # Run the base 64 code in the background
 echo $THECOMMAND | base64 -d|bash &
 pid=$! # Process Id of the previous running command
 i=0
 while kill -0 $pid 2>/dev/null
  do
   i=$(( (i+1) %4 ))
   # Print the spinning icon so the user knows the command is running
   printf "\r$COMMAND:${SPIN:$i:1}"
   sleep .2
  done
 printf "\r"
}
<snippet end>

Q:エラーを検出したりcontrol-cを使用してバックグラウンドプロセスを終了したりするには、スクリプトにどのコードを追加できますか?

追加情報:ラッパーでスクリプトを実行し、スクリーンセッションで実行しています。

myprogram.sh $1 > >(tee -a /var/tmp/myprogram_install$DATE.log) 2> >(tee -a /var/tmp/myprogram_install$DATE.log >&

ベストアンサー1

1つの方法は次のとおりです。

quit=n
trap 'quit=y' INT

progress() {
 SPIN='-\|/'
 # Run the base 64 code in the background
 echo $THECOMMAND | base64 -d|bash &
 pid=$! # Process Id of the previous running command
 i=0
 while kill -0 $pid 2>/dev/null
  do
   if [ x"$quit" = xy ]; then
    kill $pid
    break
   fi
   i=$(( (i+1) %4 ))
   # Print the spinning icon so the user knows the command is running
   printf "\r$COMMAND:${SPIN:$i:1}"
   sleep .2
  done
 printf "\r"
}

おすすめ記事