Killを使用せずにwhileループバックグラウンドプロセスを停止する方法は?

Killを使用せずにwhileループバックグラウンドプロセスを停止する方法は?

以下を含むbashスクリプトがあります。whileループプロセスを終了せずにバックグラウンドプロセスがwhileループを停止する方法は次のとおりです。止めるバナー

注:以下を使用すると、私のスクリプトは機能します。殺すしかし、一緒に停止信号役に立たない

これは私のスクリプトのデモです(Killを使用)。

#!/bin/bash


background_processes=()


trap ctrl_c INT
ctrl_c() {
    printf "\n[~] Killing background processes...\n"
    for pid in "${background_processes[@]}"
        do
          kill $pid > /dev/null 2>&1
        done

}

background_process() {
    while true
        do
         sleep 5
         printf "Hello World!\n"
        done

}

start() {

    for t in $(seq 1 10)
        do 
            background_process &
            background_processes+=(${!})
        done

    wait
}
printf "\n[I] Press 'ctrl+c' to kill background processes! \n"
start

この方法は効果的ですが、他の方法はそうではありません!

ここに停止信号がある同じデモがあります(いいえ! )

#!/bin/bash


STOP=0
threads=10
finished_threads=0

trap ctrl_c INT
ctrl_c() {
    printf "\n[~] Stopping background processes...\n"
    STOP=1
    # here i was checking that all the background processes is finish
    while true
        do
         if [[ $finished_threads == $threads ]]
             then
                break
         fi
        done
    printf "\n[+] Done\n"
 

}

background_process() {
    while true
        do
         sleep 5
         printf "Hello World!\n"
         if [[ $STOP = 1 ]]
             then
                ((finished_threads++))
                break
         fi
        done

}

start() {

    for t in $(seq 1 $threads)
        do 
            background_process &
        done

    wait
}
printf "\n[I] Press 'ctrl+c' to stop background processes! \n"
start

なぜこれがうまくいかないのか教えてください。

PS:ところで、私はアラビア語です。英語の文法が良くないと申し訳ありません。

ベストアンサー1

2番目の例が機能しない理由は、各プロセスに固有のアドレス空間があるため、$STOP基本プロセスで変数値を設定してもバックグラウンドプロセスが読み取る値に影響を与えないためです。

バックグラウンドワーカーを終了する簡単な方法は、最初の例のように信号を使用することです。別のアプローチは、同期のためにパイプを使用することです。たとえば、子プロセスが非ブロック読み取りを使用し、親プロセスが終了しようとしたときにパイプを閉じ、サブプロセスがパイプが閉じられたことを検出すると終了します。

おすすめ記事