Das Problem mit FIFOs besteht darin, dass, wenn jeder Prozess, der Daten eingibt, beendet wird, dies den lesenden Prozessen signalisiert (in diesem Fall mysql
), dass es das Ende der Daten ist, also wird es beendet.
Der Trick besteht darin, sicherzustellen, dass es einen Prozess gibt, der die FIFO-Eingabe jederzeit aktiv hält. Sie können dies tun, indem Sie sleep 999999999 > fifofile
ausführen im Hintergrund.
Beispiel:
#!/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
Am Ende beenden wir den sleep
Prozess, um den FIFO-Eingang vollständig freizugeben. Es wird mysql
signalisieren dass die Eingabe beendet ist und sie automatisch beendet wird.
Es gibt auch eine Alternative, die keine FIFOs benötigt, aber Sie benötigen zwei Skripte:
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 ...;"