[संपादित करें]
ओपन स्कूल मूल विचार था - केवल "mysql" चलाने के एक बार , और समाधान प्रदान किए गए समाधान काम करना चाहिए, लेकिन यह डिस्क पर फीफो छोड़ दिया।
nos भी सही था कि मैं खराब हो गया: एक साधारण "echo X >FIFO
" फीफो बंद कर देगा; मुझे गलत याद आया। और मेरी (हटाई गई) टिप्पणियां w.r.t. समय लागू नहीं है, क्षमा करें।
उस ने कहा, आपको फीफो की आवश्यकता नहीं है, आप एक इंटर-प्रोसेस पाइप का उपयोग कर सकते हैं। और मेरी पुरानी MySQL स्क्रिप्ट्स को देखकर, कुछ इस तरह काम करते थे, लेकिन आप किसी भी आदेश को stdout (कुछ "exec" चाल के बिना) लिखने दें।
#!/bin/bash
(
echo "LOCK TABLES mytable READ ;"
echo "Doing something..." >&2
echo "describe mytable;"
sleep 5
echo "UNLOCK tables;"
) | mysql ${ARGUMENTS}
एक और विकल्प फीफो को फ़ाइल डिस्क्रिप्टर असाइन करना हो सकता है, फिर इसे पृष्ठभूमि में चलाएं। यह बहुतnos के समान है, लेकिन "exec" विकल्प को बैश आदेश चलाने के लिए उपशीर्षक की आवश्यकता नहीं होगी; कुछ नियंत्रण मुद्दों देखते हैं
#!/bin/bash
# Use the PID ($$) in the FIFO and remove it on exit:
FIFO="/tmp/mysql-pipe.$$"
mkfifo ${FIFO} || exit $?
RC=0
# Tie FD3 to the FIFO (only for writing), then start MySQL in the u
# background with its input from the FIFO:
exec 3<>${FIFO}
mysql ${ARGUMENTS} <${FIFO} &
MYSQL=$!
trap "rm -f ${FIFO};kill -1 ${MYSQL} 2>&-" 0
# Now lock the table...
echo "LOCK TABLES mytable WRITE;" >&3
# ... do your other stuff here, set RC ...
echo "DESCRIBE mytable;" >&3
sleep 5
RC=3
# ...
echo "UNLOCK TABLES;" >&3
exec 3>&-
# You probably wish to sleep for a bit, or wait on ${MYSQL} before you exit
exit ${RC}
ध्यान दें कि: इसलिए आप "आर सी" स्थापित करने के लिए "अन्य सामग्री" में अनुमति होगी
- इस कोड को कोई त्रुटि लॉक करने के लिए विफलता की जांच करने के लिए (या "अन्य सामान" के भीतर कोई भी SQL आदेश )। और यह निश्चित रूप से गैर-तुच्छ है।
- पहले उदाहरण में, "अन्य सामान" एक सबहेल के भीतर है, आप आसानी से उस संदर्भ से स्क्रिप्ट का रिटर्न कोड सेट नहीं कर सकते हैं।
'-u'' नहीं होना चाहिए? –