bash - ترجمة - polls




في انتظار انتهاء العمليات في الخلفية قبل إنهاء النص البرمجي (3)

كيف أتأكد من الانتهاء من جميع العمليات في الخلفية قبل أن أغادر البرنامج النصي (TCL / Bash).

كنت أفكر في كتابة كل ما عندي من عملية الخلفية إلى pidfile. ثم في النهاية pgrep pidfile لمعرفة ما إذا كانت أي عمليات لا تزال قيد التشغيل قبل أن أخرج.

هل هناك طريقة أبسط للقيام بذلك؟ وهناك طريقة محددة TCL للقيام بذلك؟


إذا كنت ترغب في انتظار انتهاء المهام ، فاستخدم wait . هذا سيجعل shell ينتظر حتى تكتمل جميع مهام الخلفية. ومع ذلك ، إذا كانت أي من وظائفك تعمل على تخفيق نفسها ، فلن يعودوا أطفالهم ، ولن يكون للانتظار أي تأثير (بقدر ما يتعلق الأمر بالقضية ، فإن الطفل قد انتهى بالفعل. في الواقع ، عندما تقوم إحدى العمليات بتأديب نفسها ، فإنها تفعل ذلك بإنهائها ووضع عملية جديدة ترث دورها).

#!/bin/sh
{ sleep 5; echo waking up after 5 seconds; } &
{ sleep 1; echo waking up after 1 second; } &
wait
echo all jobs are done!

يمكنك استخدام kill -0 للتحقق ما إذا كان pid معين قيد التشغيل أم لا.

بافتراض ، لديك قائمة بأرقام pid في ملف يسمى pid في pwd

while true;
do 
    if [ -s pid ] ; then
        for pid in `cat pid`
        do  
            echo "Checking the $pid"
            kill -0 "$pid" 2>/dev/null || sed -i "/^$pid$/d" pid
        done
    else
        echo "All your process completed" ## Do what you want here... here all your pids are in finished stated
        break
    fi
done

جنو parallel و xargs هما أداتان يمكن أن تجعل البرامج النصية أكثر بساطة ، وكذلك التحكم في العدد الأقصى من المواضيع (تجمع الخيوط). على سبيل المثال:

seq 10 | xargs -P4 -I'{}' echo '{}'

أو:

seq 10 | parallel -j4  echo '{}'

انظر أيضا: كيفية كتابة قذيفة باش تجمع العمليات





grep