5つ未満の端末が開いている場合、IFSループは続行されます。

5つ未満の端末が開いている場合、IFSループは続行されます。

ループ機能があります。

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

おすすめ記事