script.sh
によってrun.sh
窒素平行。 ~のためN=1、script.sh
プロセスは実際に開始される前に30〜45秒間スリープモードに設定されます。
script.sh
すべてのインスタンスを注文するにはどうすればよいですか?N>1 始めないでください最初まで(N=1)script.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"
(メッセージを閉じる方法がわかりません)
答え2
コードを見なくても次のように見えると思います。
for k in $(seq $N)
do
script.sh &
done
したがって、別のジョブを実行する前に最初のジョブが完了するのを待つには、次のようにします。
for k in $(seq $N)
do
script.sh &
[[ $k == 1 ]] && wait
done
スクリプト自体を実行するのにかなりの時間がかかっても、作成した要件は解決されませんが、睡眠と処理を分離できない場合は、必要なものを達成することが完全に可能であるとは思いません。お客様が明記した基準を満たしています。