ループ機能があります。
while IFS='|' read -r keyword; do
xterm -e "echo -ne '\e[8;5;60t'; program -command"
done < ./filename
5つの端末を開くだけですが、1つの端末が作業をprogram -command
終えて閉じると、5つのウィンドウが開くまでループが再び開き始める必要があります。
頑張る
[ $( jobs | wc -l ) -ge 5 ] && wait
ただし、1 つの作業が完了した後は 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
しかし、まだすべてが完了するのを待っています。 1つの端末に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