Il problema con le FIFO è che quando termina ogni processo che sta immettendo dati, segnala i processi che stanno leggendo (in questo caso mysql
) che è la fine dei dati, quindi termina.
Il trucco è assicurarsi che ci sia un processo che mantenga sempre attivo l'input FIFO. Puoi farlo eseguendo un sleep 999999999 > fifofile
sullo sfondo.
Esempio:
#!/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
Alla fine terminiamo il sleep
processo per rilasciare completamente l'input FIFO. Segnala mysql
che l'input è terminato e di conseguenza morirà automaticamente.
C'è anche un'alternativa che non richiede FIFO, ma avrai bisogno di due script:
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 ...;"