-
Notifications
You must be signed in to change notification settings - Fork 0
/
parallel.named.pipes.sh
41 lines (32 loc) · 1.59 KB
/
parallel.named.pipes.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash
FinishedTasksPipe="./task4all.pipe"
LogFile="./task4all.log"
TasksTotal=30
MaxParallelTasks=8
ParallelTasks=0
# generate ${TasksTotal} random numbers for later use as tasknames. They're also a task working time (secs)
TasksList=$( while [ $(( TasksTotal-- )) -ne 0 ]; do echo\
"$(dd if=/dev/urandom bs=192 count=1 2>/dev/null | strings | wc -c)";
done;
)
# alt: use echo $(( RANDOM%12 ))
[ -p $FinishedTasksPipe ] || mkfifo $FinishedTasksPipe
# trap on ANY exit reason (FAIL/FAULT/normal exit)
# -v for verbosely delete
trap "rm -v $FinishedTasksPipe; truncate -s 0 $LogFile" EXIT
for i in $TasksList; {
[ $ParallelTasks -eq $MaxParallelTasks ]&& {
echo "[$(date +'%M:%S')] queue bank is full ($ParallelTasks). wait till at least one task to be completed..." >> $LogFile
taskscompleted=$(wc -l $FinishedTasksPipe| cut -d" " -f 1)
echo "[$(date +'%M:%S')] released $taskscompleted tasks from pipe finished queue" >> $LogFile
(( ParallelTasks-=taskscompleted ))
}
((ParallelTasks++))
echo "[$(date +'%M:%S')] t$i started (running:$ParallelTasks)" >> $LogFile && sleep ${i}s &&
echo "[$(date +'%M:%S')] t$i finished" | tee -a $FinishedTasksPipe >> $LogFile &
sleep 1; #this is just for green buffer
}
echo "[$(date +'%M:%S')] All tasks started! Soon they will be finished" | tee -a $LogFile
while [ ! $(egrep -c 't[0-9]+ started' $LogFile) -eq $(grep -Ec 't[0-9]+ finished' $LogFile) ] ; do
cat $FinishedTasksPipe
done