プロセスがスリープ状態から再開されるのを待ちます。

プロセスがスリープ状態から再開されるのを待ちます。

script.shによってrun.sh 窒素平行。 ~のためN=1script.shプロセスは実際に開始される前に30〜45秒間スリープモードに設定されます。

script.shすべてのインスタンスを注文するにはどうすればよいですか?N>1 始めないでください最初まで(N=1script.sh覚醒?プロセスは互いに直接通信できません。

他のプロセスには、最初のプロセスがまだ待機中で待機する必要があり、初期化されていますが、コードを実行できないと言いたいと思います。

プロセスは互いに直接通信できません。

ベストアンサー1

N を事前に知っていれば、fifo をセマフォとして使用できます。

mkfifo sem;
exec 3<>sem
rm -f sem

次に、各N> 1プロセスにそのプロセスからバイトを読み取らせます&3。これらのバイトは最初は使用できないため、省電力モードに切り替わります。

N == 1がスリープ状態を終了すると、Nバイトを&3に書き込むことができ、&3バイトを待っていたすべてのプロセスを起動できます。

#!/bin/bash -e
mkfifo p
exec 3<>p
rm p 
main()(
    echo $FUNCNAME beg
    sleep 2  &>/dev/null
    printf '\n\n\n' >&3
    echo $FUNCNAME end
) 
worker()(
    echo $FUNCNAME$1 beg
    read -n 1 <&3
    echo $FUNCNAME$1 end
) 

main &
worker 1 &
worker 2 &
worker 3 &
wait

出力:

main beg
worker1 beg
worker2 beg
worker3 beg
main end
worker2 end
worker3 end
worker1 end

別のアプローチは、信号を使用することです。スクリプトがターミナルジョブ$$(親シェルpid)で実行されていることがそのプロセスグループのプロセスグループIDであることを確認できる場合は、ワーカーを無期限の休止状態にすることができます(理想的には関数をpause呼び出すプロセス)。sleep $hugevalue前にはしないでください)その前にSIGUSR1のようなハンドラを構築してください。基本プロセスの最初のワーカーはこのシグナルを無視する必要があります。その後、最初の労働者は他のすべての労働者にシグナルを送って作業者を継続させることができ、kill -SIGUSR1 -$$それによって無期限の眠りの人々が死にます。

#!/bin/bash
trap ' ' SIGUSR1
main()(
    trap - SIGUSR1
    echo $FUNCNAME beg
    sleep 2  &>/dev/null
    echo $FUNCNAME end
    kill -s SIGUSR1 -$$
) 
worker()(
    trap ' ' SIGUSR1
    echo $FUNCNAME$1 beg
    sleep 10000000000 &>/dev/null 
    echo $FUNCNAME$1 end
) 

main &
worker 1 &
worker 2 &
worker 3 &
wait

出力:

main beg
worker2 beg
worker1 beg
worker3 beg
main end
User defined signal 1
worker1 end
User defined signal 1
worker3 end
User defined signal 1
[1]    31554 user-defined signal 1  ./scr1

"user-defined signal 1"(メッセージを閉じる方法がわかりません)

おすすめ記事