병렬 Bash 스크립트의 스레드 수 제한

병렬 Bash 스크립트의 스레드 수 제한

제가 사용하는 일부 사진 처리 스크립트를 개선하기 위해 세마포어를 사용하려고 합니다. 나는 주어진 파일 이름을 인수로 취하고 파일을 처리하는 travail이라는 함수를 사용하여 sable GNU/DEBIAN을 실행합니다.

현재 이 함수는 루프를 통해 동일한 스크립트에서 호출됩니다.

  for i in *.png ; do
    travail $i &
    done

문제는 사진이 많으면 메모리를 많이 쓴다는 점이다. 스레드 수를 제한하기 위해 세마포어를 사용하고 싶습니다.

나는 시도했다:

for i in *.png ; do
sem -j+0 travail $i
done
sem --wait

하지만 작동하지 않고 다음 메시지가 표시됩니다. /bin/bash: travail : commande introuvable(명령을 찾을 수 없음을 의미)

함수를 정의한 후 내보내기 -f travail을 추가해 보았지만 작동하지 않습니다.

출력 예(이 예에는 2개의 파일이 있습니다)

이미지 113_XT1S3739.png 문제 Convert-im6.q16: x': Aucun fichier ou dossier de ce type @ error/blob.c/OpenBlob/2874. convert-im6.q16: no decode delegate for this image format"@ error/constitute.c/ReadImage/560" 이미지를 열 수 없습니다. Convert-im6.q16: -quality': -unsharp @ error/convert.c/ConvertImageCommand/2460. composite-im6.q16: invalid argument for option-quality' 옵션에 대한 잘못된 인수: sortie/grand_format/ne_pas_publier_113_XT1S3739.jpg @ error/composite.c/CompositeImageCommand/1241. 이미지 113_XT1S3779.png Convert-im6.q16 문제: x': Aucun fichier ou dossier de ce type @ error/blob.c/OpenBlob/2874. convert-im6.q16: no decode delegate for this image format"@error/constitute.c/ReadImage/560" 이미지를 열 수 없습니다. Convert-im6.q16: -quality': -unsharp @ error/convert.c/ConvertImageCommand/2460. composite-im6.q16: invalid argument for option-quality' 옵션에 대한 잘못된 인수: sortie/grand_format/ne_pas_publier_113_XT1S3779.jpg @ error/composite.c/CompositeImageCommand/1241. 등.

자세한 내용은 여기에 스크립트가 있습니다.

   # !/bin/bash
    # _____________________________ Paramètres
    T_WEB="1000"   # Taille maxi des images pour le web
    Q_WEB="100"   # Qualité des images pour le web (100 car il faut les réouvrir pour mettre le logo)
    #
    H_MOY="1795"   # Hauteur maxi des images pour impression ?x15
    L_MOY_11="1347"  # Largeur maxi des images pour impression 11x15
    L_MOY_10="1204"  # Largeur maxi des images pour impression 10x15
    Q_MOY="96"   # Qualité des images pour impression 10x15
    #
    Q_GRA="99"   # Qualité des grandes images
    #
    B_INT="0.1%"   # Taille de la bordure intérieure
    B_CEN="0.3%"   # Taille de la bordure intérieure
    B_EXT="4%"   # Taille de la bordure extérieure
    C_INT="white"   # Couleur de la bordure intérieure
    C_CEN="black"   # Couleur de la bordure intérieure
    C_EXT="white"   # Couleur de la bordure extérieure
    #
    # __________________________________________________________________
    #
    # Fonction principale
    #
    function travail
    {
    # Lecture du nom de fichier à traiter
    local f=$1
    echo 'travail sur image' $f
    # Récupération d'infos sur l'image en cours
    local LARG=`convert -quiet -ping $f -format "%w" info:`
    local HAUT=`convert -quiet -ping $f -format "%h" info:`
    local LARG=${LARG:0:4} # On ne conserve que les 4 premiers chiffres, le reste n'est pas bon
    local HAUT=${HAUT:0:4}
    local DECALE_X=$(($LARG/24))
    local DECALE_Y=$(($HAUT/22))
    #
    # Récupération du nom du fichier et de l'extension
    local nomfichier="${f%%.*}"
    #
    # Recuperation donnees EXIF (elles sont écrites dans un fichier temporaire)
    if [ -f "${nomfichier}.RAF" ]
    then
     exiv2 -q ex ${nomfichier}.RAF
    fi
    if [ -f "${nomfichier}.NEF" ]
    then
     exiv2 -q ex ${nomfichier}.NEF
    fi
    #
    # Ajout des bordures
    convert $f -quiet -bordercolor ${C_INT} -border ${B_INT}  -bordercolor ${C_CEN} -border ${B_CEN} -bordercolor ${C_EXT} -border ${B_EXT}x${B_EXT} -quality 01 /tmp/$f
    #
    # Création image WEB
    convert /tmp/$f -resize ${T_WEB}x${T_WEB} -quality ${Q_WEB} -unsharp 3 sortie/web/${nomfichier}_pour_internet.jpg
    if [ -f "${nomfichier}.NEF" ]
    then
     mv ${nomfichier}.exv sortie/web/${nomfichier}_pour_internet.exv
     exiv2 in sortie/web/${nomfichier}_pour_internet.jpg
     exiftool -Orientation=1 -n sortie/web/${nomfichier}_pour_internet.jpg
     rm sortie/web/${nomfichier}_pour_internet.jpg_original
    fi
    #
    # Ajout logo puis conversion en JPG
    composite -compose Over -geometry +$DECALE_X+$DECALE_Y -gravity SouthEast /home/pierre/Documents/Photo/baniere-logo/logo_800x600.png /tmp/$f -quality ${Q_GRA} sortie/grand_format/ne_pas_publier_${nomfichier}.jpg
    #
    if [ -f "${nomfichier}.NEF" ]
    then
     mv sortie/web/${nomfichier}_pour_internet.exv sortie/grand_format/ne_pas_publier_${nomfichier}.exv
     exiv2 in sortie/grand_format/ne_pas_publier_${nomfichier}.jpg
     exiftool -Orientation=1 -n sortie/grand_format/ne_pas_publier_${nomfichier}.jpg
     rm sortie/grand_format/ne_pas_publier_${nomfichier}.jpg_original
     rm sortie/grand_format/ne_pas_publier_${nomfichier}.exv
    fi
    # Suppression des fichiers inutiles
    rm /tmp/$f
    if [ -f "${nomfichier}.RAF" ]
    then
     rm ${nomfichier}.exv
    fi
    }
    #
    # _____________________________ Création des dossiers et préparation ___________________________________________
    if test -e sortie; then
    rm -rf sortie
    fi
    mkdir sortie
    mkdir sortie/web
    mkdir sortie/grand_format
    #
    # _____________________________ Appel de la fonction en parallèle sur toutes les images PNG
    #
    #
    for i in *.png ; do
             travail $i &                                                                 
    done 
    wait
    #
    # _____________________________ Fin de la fonction ________________________________________________________
    #
    echo
    echo TERMINÉ

관련 정보