Problemet med FIFO'er er, at når hver proces, der indtaster data, afsluttes, signalerer den de processer, der læser (i dette tilfælde mysql
), at det er slutningen af dataene, så det afsluttes.
Tricket er at sikre, at der er en proces, der holder FIFO-inputtet i live hele tiden. Du kan gøre det ved at køre en sleep 999999999 > fifofile
i baggrunden.
Eksempel:
#!/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
Til sidst afslutter vi sleep
proces for at frigive FIFO-inputtet fuldstændigt. Det vil signalere mysql
at inputtet er afsluttet, og det vil automatisk dø som følge heraf.
Der er også et alternativ, der ikke kræver FIFO'er, men du skal bruge to scripts:
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 ...;"