I’m doing a shell script and the unknown situation occurred. I must execute a certain number of processes, lets suppose 12. But I want to limit the executions by ‘t’ each time. So if ‘t’ is 3 I would have to execute 3 processes then 3, 3 and finally 3. But I would like to do it automatically, so I need to monitore those running processes and when one of them has finished I must execute one of the remaining processes.
After some research, I have found the following command:
launch backgroundprocess &
PROC_ID=$!
while kill -0 "$PROC_ID" >/dev/null 2>&1; do
echo "PROCESS IS RUNNING"
done
echo "PROCESS TERMINATED"
Proposed by cuonglm.
This can help to know if a process is running or not. I tried to create 12 processes and save them in 3 different variables, but it isn’t working properly.
processors=3
counter=0
for A in {1..12}
do
counter=$((counter+1))
backgroundprocess &
PID[$A]=$!
while [ $counter -eq $processors ]
do
if kill -0 "$PID[1]" >/dev/null 2>&1;
then
counter=$(($counter-1))
break
fi
done
done
Do any of you know how can I do this work?
Advertisement
Answer
That’s the improvement of your script.
ps -o pid= -p ${PID[$i]}
returns PID
if process exists.
num
stands for the number of job finished.
processors=3
counter=0
num=0
for A in {1..12}
do
counter=$((counter+1))
sleep 4 &
if [ $num -eq 0 ]
then
PID[$A]=$!
else
PID[$num]=$!
fi
echo "$A starts"
echo $counter
while [ $counter -eq $processors ]
do
for i in `seq 1 $processors`
do
if [ ! `ps -o pid= -p ${PID[$i]}` ]
then
counter=$(($counter-1))
echo "$i stopped"
num=$i
break
fi
done
done
done