FIFOの問題は、データを入力しているすべてのプロセスが終了すると、読み取り中のプロセス(この場合はmysql
)に信号を送ることです。 )データの終わりなので、終了します。
秘訣は、FIFO入力を常に有効に保つプロセスがあることを確認することです。これを行うには、sleep 999999999 > fifofile
を実行します。 バックグラウンドで。
例:
#!/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
最後に、sleep
を終了します FIFO入力を完全に解放するプロセス。 mysql
に信号を送ります 入力が終了し、結果として自動的に停止すること。
FIFOを必要としない代替手段もありますが、2つのスクリプトが必要になります。
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 ...;"