Masalah dengan FIFO adalah ketika setiap proses yang memasukkan data berakhir, itu menandakan proses yang sedang membaca (dalam hal ini mysql
) bahwa ini adalah akhir dari data, sehingga diakhiri.
Triknya adalah memastikan bahwa ada proses yang menjaga input FIFO tetap hidup setiap saat. Anda dapat melakukannya dengan menjalankan sleep 999999999 > fifofile
di latar belakang.
Contoh:
#!/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
Pada akhirnya kami menghentikan sleep
proses untuk melepaskan input FIFO sepenuhnya. Ini akan memberi sinyal mysql
bahwa input telah berakhir dan akibatnya akan mati secara otomatis.
Ada juga alternatif yang tidak memerlukan FIFO, tetapi Anda memerlukan dua skrip:
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 ...;"