Problém s FIFO je v tom, že když každý proces, který zadává data, skončí, signalizuje to procesům, které čtou (v tomto případě mysql
), že je to konec dat, takže skončí.
Trik spočívá v tom, že se ujistíte, že existuje proces, který neustále udržuje vstup FIFO naživu. Můžete to udělat spuštěním sleep 999999999 > fifofile
na pozadí.
Příklad:
#!/bin/sh
mkfifo /tmp/sqlpipe
sleep 2147483647 > /tmp/sqlpipe &
PID=$!
mysql -B -uUSER -pPASSWORD < /tmp/sqlpipe &
# all set up, now just push the SQL queries to the pipe, exemple:
echo "INSERT INTO table VALUES (...);" > /tmp/sqlpipe
echo "INSERT INTO table VALUES (...);" > /tmp/sqlpipe
echo "INSERT INTO table VALUES (...);" > /tmp/sqlpipe
cat "mysqldump.sql" > /tmp/sqlpipe
echo "DELETE FROM table WHERE ...;" > /tmp/sqlpipe
# done! terminate pipe
kill -s SIGINT $PID
rm /tmp/sqlpipe
Nakonec ukončíme sleep
proces pro úplné uvolnění vstupu FIFO. Bude to signalizovat mysql
že vstup skončil a v důsledku toho automaticky zemře.
Existuje také alternativa, která nevyžaduje FIFO, ale budete potřebovat dva skripty:
run.sh:
#!/bin/sh
./querygenerator.sh | mysql -B -uUSER -pPASSWORD
querygenerator.sh:
#!/bin/sh
echo "INSERT INTO table VALUES (...);"
echo "INSERT INTO table VALUES (...);"
echo "INSERT INTO table VALUES (...);"
cat "mysqldump.sql"
echo "DELETE FROM table WHERE ...;"