信号の使用を検討しましたか? (引数を渡さずに) イベントをトリガーすることだけが必要な場合は、 kill と trap を使用すると完全に機能します (ただし、セマンティクスには注意してください。たとえば、SIGUSR1 を使用してください)。
ただし、次の例のように、ロジックを作り直す必要がある場合があります。
subprocess_finished()
{
np=$( jobs -p | wc -l )
}
start_processing()
{
myfile="$1"
# DO SOMETHING HERE!!
kill -SIGUSR1 $2
}
CPUS=$( lscpu | grep "^CPU(s):" | rev | cut -f 1 -d ' ' | rev )
POLLPERIOD=5 # 5s between each poll
np=0
trap subprocess_finished SIGUSR1
for myfile in *
do
start_processing "$myfile" $$ &
np=$( jobs -p | wc -l )
echo "$( date +'%Y-%m-%d %H:%M:%S' ) [$!] Starting #$np on $CPUS: $myfile"
if [ $np -eq $CPUS ]
then
# Wait for one CPU to be free
trap subprocess_finished SIGUSR1
while [ $np -eq $CPUS ]
do
sleep $POLLPERIOD
done
fi
done
done
# wait for the last subprocesses
while [ ! -z "$( jobs -rp )" ]
do
sleep $POLLPERIOD
done