プログラムが期待通りに実行されない

プログラムが期待通りに実行されない

私は次の bash シェル スクリプトを持っていますが、90% の確率で期待どおりに動作しますが、時々動作しません。問題は日付と時刻の配置にあります。示されているように、私はプログラムに のdate末尾にを追加するように指示しましたscreenlog.0。ほとんどの場合、これは適切に行われます。しかし、時々日付と時刻が に追加されます。始まりscreenlog.0。 の形式はscreenlog.0特定のガイドラインに従う必要があるため、これは非常に面倒です。 ご協力いただければ幸いです。

#!/bin/bash
...
...

if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt || [ -e "dicounter_${string1}_from_${string2}" ];
then
   echo "dicounter_${string1}_from_${string2} already exists in the MasterFile or the current directory. Would you like to proceed?"
   read string3
   if [[ "${string3^}" == 'Y' ]]; then
      echo "How many times has this dicounter been retested? (e.g. 1 for first time, 2 for the second, ...)"
      read string4
      screen -S trans -L /dev/ttyACM0
      screen -S trans -X stuff 's'$(echo -ne '\015')
      sleep 8s
      screen -S trans -X quit
      date +%F~%H:%M:%S >> screenlog.0
      mv screenlog.0 dicounter_${string1}_from_${string2}~${string4}

   else
      exit 0
   fi
else
  #opening screen & begin analysis
  screen -S trans -L /dev/ttyACM0
  screen -S trans -X stuff 's'$(echo -ne '\015')
  sleep 8s
  screen -S trans -X quit
  date +%F~%H:%M:%S >> screenlog.0
  mv screenlog.0 dicounter_${string1}_from_${string2}

fi

基本的に、このプログラムは、がすでに存在するかどうかを確認しdicounter_..._from_...、存在しない場合、またはユーザーが別のテスト実行を希望する場合は、続行して送信機に接続し、データを取得します。最後に、screenlog.0ファイルが作成され、そのファイルの末尾に日付と時刻を追加します。次に、名前を変更します。

答え1

screen の「quit」コマンドがログをフラッシュする前に返されていたようです。最後の screen コマンドと日付スタンプの間に遅延を追加すると、screen がログへの書き込みを完了する時間を確保できます。別のオプションとしては、「busy」ループを使用してログへの書き込みを待機する方法があります。

...
screen -S trans -X quit
while [ ! -s screenlog.0 ]
do
  sleep 1
done
date +%F~%H:%M:%S >> screenlog.0
...

関連情報