whileループが背景を殺す

whileループが背景を殺す

ストップウォッチとして機能するwhileループがあります。コマンドの実行にかかる時間を計算するために、これをスクリプトに実装したいと思います。コマンド完了後に終了したい。

date1=`date +%s`; while true; do 
   echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
done &

スクリプト内でこのループを終了する必要があります。

頑張った

    1-jobs but it gives me no output
    2-kill $! but give me erro

しかし、ループは引き続き実行されます

答え1

timeoutパッケージに提供されているコマンドを使用してくださいcoreutils

NAME

   timeout - run a command with a time limit

SYNOPSIS
   timeout [OPTION] DURATION COMMAND [ARG]...
   timeout [OPTION]

DESCRIPTION
   Start COMMAND, and kill it if still running after DURATION.

答え2

同じ問題が発生しましたが、背景が異なります!

whileループを関数にして呼び出した直後にPIDを取得し、その変数で終了します。

function loopToKill() { # while loop inside a function
   while true; do 
      echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
      sleep 1 # gotta have a sleep unless you want it to go crazy in the terminal
   done 
}

date1=`date +%s`
loopToKill &    # run in background
loopPID=$!      # get pid

# wait for whatever you needed

kill loopPID    # here's where it get's cool

上記で必要に応じて削除できますが、必要なものを待つのはすべてです。これは私の状況に最適なソリューションであり、プロセスにどれくらい時間がかかっても常にスピナーを使用します。これは私の場合ですが、プロセス全体でタイマーを実行し続ける必要がある場合はこれが必要です。

もう一つの素晴らしい点は、入力を使用してそれを終了することです。これにはもう少し掘り下げる作業が必要です。現在、楽しく作業しているが危険だという内容を読む以外に、bashのユーザー入力についてあまり知りません。頑張ってください。役に立ったら、いいねを押してください!

関連情報