Portál AbcLinuxu, 16. července 2025 19:04


Dotaz: BASH ukončení funkce po splnění podmínky

1.8.2012 14:48 MM
BASH ukončení funkce po splnění podmínky
Přečteno: 195×
Odpovědět | Admin
Ahoj,

mám funkci
function tree {
 ...
 ...
 ...
# všechno se provedlo
# teď vytvořím soubor a.success abych dal vědět scriptu, že jsem hotov
echo "success" > /tmp/a.success
# teď musím počkat až bude existovat soubor b.success který vytvoří script který jede normálně na popředí

 while [ -f /tmp/b.success ]
 do
  break # Tady má být možná něco jiného pro ukončení toho cyklu a celé funkce tree
 done
}

#volám funkci tree, spouštím ji na pozadí

tree &

# tady pokračuji dál
 ...
 ...
 ...
# všechno se provedlo
# teď vytvořím soubor b.success abych dal vědět funkci tree, že jsem hotov
# teď musím počkat až bude existovat soubor a.success který vytvoří funkce tree
 while [ -f /tmp/a.success ]
 do
  break # Tady má být možná něco jiného pro ukončení toho cyklu a celé funkce tree
 done

echo "Hotovo, končím"
Jenže to nějak nefunguje :-( co je špatně? máte lepší řešení? Díky za pomoc
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

1.8.2012 15:44 tomo_tn
Rozbalit Rozbalit vše Re: BASH ukončení funkce po splnění podmínky
Odpovědět | | Sbalit | Link | Blokovat | Admin
#!/bin/bash
rm /tmp/succes

function tree() {
while [ ! -f /tmp/succes ] ; do
        echo "tree is growing" ; sleep 1
done
}

tree &

sleep 5
touch /tmp/succes
1.8.2012 15:56 Marble | skóre: 27 | blog: marble
Rozbalit Rozbalit vše Re: BASH ukončení funkce po splnění podmínky
Odpovědět | | Sbalit | Link | Blokovat | Admin

Proč je tam to čekání křížem? To má nějaký smysl?

Pokud je účelem počkat na skončení podprocesu, tak na to má bash přímo interní příkaz wait.

Negace podmínky existence souboru už tu padla, ale dělat idle cyklus je pěkná prasárna. Sleep to částečně "řeší" (dokud těhle cyklů se sleep nepoběží moc), ale také záleží, jestli je případná prodleva OK. Slušnější je čekat na nějakou událost (zapsání znaku do souboru/roury), kterou je možné číst blokujícím systémovým voláním (třeba právě pomocí read z předem vytvořeného souboru). Případně se dá velmi podobně využít flock, který umí blokovat, dokud se zámek neuvolní.

Další možnost, ale jen v novém bashi (verze 4) je interní příkaz coproc, který spustí příkaz na pozadí a rovnou k němu otevře anonymní pipe, takže pro komunikaci pak není vůbec potřeba filesystém.

1.8.2012 18:42 MM
Rozbalit Rozbalit vše Re: BASH ukončení funkce po splnění podmínky
Použil jsem wait, díky za pomoc..

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.