Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: kkt1 27. 12. 2018, 13:16:39

Název: Skript v bash a parallel
Přispěvatel: kkt1 27. 12. 2018, 13:16:39
Zdravim, mam trochu hokej s prikazem parallel v linuxu. Dokumentaci jsem se snazil aplikovat, zatim neuspesne. Mam skript v bashi, ktery dela mimo jine i:
for file in ./
do
   command1
   ...
   commandx
done

Rad bych cely ten loop paralelizoval pres parallel, ale mam hokej v tom jak to udelat jako celek. Nechci paralelizovat jednotlive prikazy z toho loopu, chci cely ten loop tak jak je paralelizovat. Samozrejme jsou v nem ruzne promenne. A rad bych taky omezil mnozstvi paralelne spustenych prikazu. Ma nekdo praktickou zkusenost? Staci mozna nakopnout.
Název: Re:Skript v bash a parallel
Přispěvatel: Mufasa 27. 12. 2018, 13:40:45
Ak hovorime o GNU parallel, tak osobne to casto robim stylom

#ak sa jedna o jeden prikaz
for item in array
do
  echo "file $item"
done | parallel -k -j 4

#ak viacero, pripadne pomocou funkcie
my_job(){
  item=$1
  various
  commands
}; export -f my_job

for item in array
do
  echo "my_job $item"
done | parallel -k -j 4

samozrejme treba mat spravne exportovane premenne atd, ak su vyuzivane
Název: Re:Skript v bash a parallel
Přispěvatel: kkt1 27. 12. 2018, 13:59:58
Myslim, ze prave ty promenne mi delaji potize. Jak vidis, tak delam nejake operace nad soubory v adresari, tudiz ten nazev dostanu drive nez ten loop. Jak to spravne zahrnout do te funkce? Pokud to necham v ramci funkce tak predpokladam ze kazdy z tech paralelnich procesu zacne od prvniho souboru.
Název: Re:Skript v bash a parallel
Přispěvatel: Kit 27. 12. 2018, 14:12:45
Zkus tohle:
Kód: [Vybrat]
find . -type f -print0 | xargs -0 -P 4 -I % bash -c 'echo "%"; head -n1 "%";'
Název: Re:Skript v bash a parallel
Přispěvatel: Mufasa 27. 12. 2018, 14:19:46
Asi uplne nechapem, ale v podstate pre tvoj priklad presne:

Kód: [Vybrat]
my_job(){
   file=$1
   command1
   ...
   commandx
}; export -f my_job

for file in ./
do
  echo "my_job $file"
done | parallel -j 4

v podstate len "obsah" loopu vytlacis do funkcie, ak potrebuju tie commandy nejake premenne tak mozno musis este spravit export nad nimi, ale to uz je specificke ku kazdemu commandu.
Název: Re:Skript v bash a parallel
Přispěvatel: stepan 27. 12. 2018, 14:29:21
Linux nepouzivam. To taky radim tobe.
Název: Re:Skript v bash a parallel
Přispěvatel: Kit 27. 12. 2018, 14:35:07
Linux nepouzivam. To taky radim tobe.

No dobrá, ale jak bys tento požadavek vyřešil ve svém oblíbeném operačním systému?
Název: Re:Skript v bash a parallel
Přispěvatel: Lojza 27. 12. 2018, 14:39:32
Kit - mne takovehle onelinery neprestavaji udivovat co se da udelat na jedne radce kdyz clovek umi ...
Název: Re:Skript v bash a parallel
Přispěvatel: kkt1 27. 12. 2018, 14:47:26
Kite, inspirativni, dekuji.
Název: Re:Skript v bash a parallel
Přispěvatel: Jenda 27. 12. 2018, 18:25:58
Já bych chtěl jenom upozornit, že existují dva programy "parallel" - jeden je GNU Parallel z balíčku parallel a jeden je z balíčku moreutils. A samozřejmě se chovají dost rozdílně.
Název: Re:Skript v bash a parallel
Přispěvatel: erik80 28. 12. 2018, 10:44:44
viem, ze si ziadal vyslovene pouzit "parallel". da sa to vsak napriklad aj takto:


#!/bin/bash
echo "start of script"
for i in 3 8 1 5
do
     (
         echo "start sleep $i"
    sleep $i
         echo "end sleep $i"
      )&
done
wait
echo "end of script"

Název: Re:Skript v bash a parallel
Přispěvatel: kkt1 28. 12. 2018, 12:49:30
dekuji vsem za napady, vyresil jsem to pres GNU parallel. Ne uplne tak jak bych chtel, ale je to funkcni.