تسلسل باش:انتظر الإخراج، ثم ابدأ البرنامج التالي
سؤال
في حالتي لا بد لي من تشغيل openvpn
قبل الدخول إلى الخادم، و openvpn
يردد الأمر "اكتمل تسلسل التهيئة".
لذلك، أريد أن يقوم البرنامج النصي الخاص بي بإعداد openvpn
ومن ثم سش في.
سؤالي هو:كيف يمكنك تنفيذ أمر في bash في الخلفية وانتظار صدى "مكتمل" قبل تشغيل برنامج آخر؟
طريقتي الحالية للقيام بذلك هي فتح جزأين طرفيين، أحدهما قيد التشغيل:
sudo openvpn --config FILE
وفي الآخر أركض:
ssh SERVER
بمجرد أن يظهر لي الجزء الطرفي الأول نص "اكتمل تسلسل التهيئة".
المحلول
يبدو أنك تريد ذلك قم بتشغيل openvpn كعملية في الخلفية أثناء معالجة stdout الخاص به في المقدمة.
exec 3< <(sudo openvpn --config FILE)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
# VPN initialization is now complete and running in the background
ssh SERVER
توضيح
دعونا نقسمها إلى أجزاء:
echo <(sudo openvpn --config FILE)
سوف طباعة شيء من هذا القبيل/dev/fd63
- ال
<(..)
أشواط openvpn في الخلفية، و... - يعلق stdout الخاص به على واصف الملف، الذي تتم طباعته بواسطة
echo
- ال
exec 3< /dev/fd63
- (أين /ديف/fd63 هو واصف الملف المطبوع من الخطوة 1)
- هذا يخبر الصدفة بفتح واصف الملف (/ديف/fd63) للقراءة، و...
- جعله متاحا في واصف الملف
3
sed '/Initialization Sequence Completed$/q' <&3
- الآن نركض سيد في المقدمة، ولكن اجعلها تقرأ من واصف الملف
3
لقد فتحنا للتو - في أقرب وقت سيد يرى أن السطر الحالي ينتهي بـ "اكتمال تسلسل التهيئة"، فإنه يتم إنهاءه (ملف /س جزء)
- الآن نركض سيد في المقدمة، ولكن اجعلها تقرأ من واصف الملف
cat <&3 &
- openvpn سيستمر في الكتابة إلى واصف الملف
3
وفي النهاية يتم حظره إذا لم تتم قراءة أي شيء منه - لمنع ذلك، نركض قطة في الخلفية لقراءة بقية الإخراج
- openvpn سيستمر في الكتابة إلى واصف الملف
الفكرة الأساسية هي الجري openvpn
في الخلفية، ولكن قم بالتقاط مخرجاته في مكان ما حتى نتمكن من تشغيل أمر في المقدمة والذي سيتم حظره حتى يقرأ الكلمات السحرية، "اكتمل تسلسل التهيئة".يحاول الكود أعلاه القيام بذلك دون إنشاء ملفات مؤقتة فوضوية، ولكن قد تكون الطريقة الأبسط هي استخدام ملف مؤقت فقط.
نصائح أخرى
يستخدم -m 1
معا مع --line-buffered
في grep لإنهاء grep بعد المباراة الأولى في دفق مستمر.يجب أن يعمل هذا:
sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER