Vấn đề với FIFOs là khi mọi quá trình nhập dữ liệu kết thúc, nó báo hiệu các quá trình đang đọc (trong trường hợp này là mysql
) rằng nó là phần cuối của dữ liệu, vì vậy nó sẽ kết thúc.
Bí quyết là đảm bảo rằng luôn có một quy trình giữ cho đầu vào FIFO luôn tồn tại. Bạn có thể làm điều đó bằng cách chạy sleep 999999999 > fifofile
trong nền.
Thực hiện:
#!/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
Cuối cùng, chúng tôi chấm dứt sleep
quá trình giải phóng hoàn toàn đầu vào FIFO. Nó sẽ báo hiệu mysql
rằng đầu vào đã kết thúc và hậu quả là nó sẽ tự động chết.
Ngoài ra còn có một giải pháp thay thế không yêu cầu FIFO, nhưng bạn sẽ cần hai tập lệnh:
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 ...;"