Problem z FIFO polega na tym, że kiedy każdy proces, który wprowadza dane, kończy działanie, sygnalizuje to procesy, które czytają (w tym przypadku mysql
), że to koniec danych, więc się kończy.
Sztuczka polega na upewnieniu się, że istnieje proces, który utrzymuje przy życiu wejście FIFO przez cały czas. Możesz to zrobić, uruchamiając plik sleep 999999999 > fifofile
w tle.
Przykład:
#!/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
W końcu kończymy sleep
proces, aby całkowicie zwolnić wejście FIFO. Zasygnalizuje to mysql
że wejście się zakończyło i w konsekwencji automatycznie umrze.
Istnieje również alternatywa, która nie wymaga FIFO, ale będziesz potrzebować dwóch skryptów:
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 ...;"