![5개 미만의 터미널이 열려 있으면 IFS 루프가 계속됩니다.](https://linux55.com/image/139867/5%EA%B0%9C%20%EB%AF%B8%EB%A7%8C%EC%9D%98%20%ED%84%B0%EB%AF%B8%EB%84%90%EC%9D%B4%20%EC%97%B4%EB%A0%A4%20%EC%9E%88%EC%9C%BC%EB%A9%B4%20IFS%20%EB%A3%A8%ED%94%84%EA%B0%80%20%EA%B3%84%EC%86%8D%EB%90%A9%EB%8B%88%EB%8B%A4..png)
루프 기능이 있습니다.
while IFS='|' read -r keyword; do
xterm -e "echo -ne '\e[8;5;60t'; program -command"
done < ./filename
5개의 터미널만 열면 되지만, program -command
한 터미널이 작업을 마치고 닫히면 5개의 창이 열릴 때까지 루프가 다시 열리기 시작해야 합니다.
나는 노력한다
[ $( jobs | wc -l ) -ge 5 ] && wait
하지만 하나의 작업이 완료된 후에는 4개만 열려 있으며 마지막 작업이 열릴 때까지 기다렸다가 5번 다시 시작해야 합니다.
어쩌면 누군가가 이 스크립트를 수정하여 작동할 수도 있습니다.
while [ `ps -p ${pid1},${pid2} | wc -l` < 5 ]
do
sleep 1
done
이 스크립트는 매초마다 새로운 터미널을 실행합니다...
while IFS='|' read -r keyword; do
xterm -e "echo -ne '\e[8;5;60t'; program -command" &
sleep 1
done < ./filename
하지만 5x 터미널이 열려 있는지 확인하고 그렇지 않으면 루프를 다시 실행해야 합니다.
while IFS='|' read -r keyword; do
xterm -e "echo -ne '\e[8;5;60t'; program -command"
# Script to block loop until less than 5 terminal are open
while [ `ps -p ${pid1},${pid2} | wc -l` < 5 ]
do
echo "There is less than 5 terminals opened"
done
done < ./filename
이런걸 발견했는데 어떻게 수정하나요?
while [ $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done
내가 대본을 만들었어
child_count=$(($(pgrep --parent $$ | wc -l) - 1))
if [ "$child_count" -lt "5" ]; then
echo "Opened terminals: $child_count"
else [ "$child_count" -ge "5" ]
echo "Too many termianls: $child_count"; wait
fi
그러나 여전히 모든 것이 완료되기를 기다리고 있습니다. 하나의 터미널에 5개 미만이 있으면 10초마다 확인해야 합니다.
해결책을 찾았습니다.
check_processes(){
while true; do
child_count=$(($(pgrep --parent $$ | wc -l) - 1))
if [ "$child_count" -lt "5" ]; then
echo "Opened terminals: $child_count"
break
else [ "$child_count" -ge "5" ]
echo "Too many termianls: $child_count"; sleep 10; check_processes
fi
done
}
check_processes
답변1
이 코드 조각은 5개의 창을 생성합니다 xterm
. 그들을 죽이면 또 다른 사람이 생성됩니다.
#!/bin/bash
#
pids=()
# Eternal loop
while :
do
if [[ ${#pids[@]} -lt 5 ]]
then
# Start another process
xterm &
pid=$!
# Save process id
pids+=($pid)
else
# We have enough so wait for (at least) one to die
wait -n
# Reap old process ids
oldpids=("${pids[@]}")
pids=()
n=0
while [[ $n -lt ${#oldpids[@]} ]]
do
pid=${oldpids[$n]}
[[ -n "$pid" ]] && kill -0 $pid 2>/dev/null && pids+=($pid)
n=$((n+1))
done
fi
done