Portál AbcLinuxu, 16. července 2025 19:04
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
#!/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
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.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.