تسلسل باش:انتظر الإخراج، ثم ابدأ البرنامج التالي

StackOverflow https://stackoverflow.com//questions/21001220

سؤال

في حالتي لا بد لي من تشغيل 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

توضيح

دعونا نقسمها إلى أجزاء:

  1. echo <(sudo openvpn --config FILE) سوف طباعة شيء من هذا القبيل /dev/fd63
    • ال <(..) أشواط openvpn في الخلفية، و...
    • يعلق stdout الخاص به على واصف الملف، الذي تتم طباعته بواسطة echo
  2. exec 3< /dev/fd63
    • (أين /ديف/fd63 هو واصف الملف المطبوع من الخطوة 1)
    • هذا يخبر الصدفة بفتح واصف الملف (/ديف/fd63) للقراءة، و...
    • جعله متاحا في واصف الملف 3
  3. sed '/Initialization Sequence Completed$/q' <&3
    • الآن نركض سيد في المقدمة، ولكن اجعلها تقرأ من واصف الملف 3 لقد فتحنا للتو
    • في أقرب وقت سيد يرى أن السطر الحالي ينتهي بـ "اكتمال تسلسل التهيئة"، فإنه يتم إنهاءه (ملف جزء)
  4. cat <&3 &
    • openvpn سيستمر في الكتابة إلى واصف الملف 3 وفي النهاية يتم حظره إذا لم تتم قراءة أي شيء منه
    • لمنع ذلك، نركض قطة في الخلفية لقراءة بقية الإخراج

الفكرة الأساسية هي الجري openvpn في الخلفية، ولكن قم بالتقاط مخرجاته في مكان ما حتى نتمكن من تشغيل أمر في المقدمة والذي سيتم حظره حتى يقرأ الكلمات السحرية، "اكتمل تسلسل التهيئة".يحاول الكود أعلاه القيام بذلك دون إنشاء ملفات مؤقتة فوضوية، ولكن قد تكون الطريقة الأبسط هي استخدام ملف مؤقت فقط.

نصائح أخرى

يستخدم -m 1 معا مع --line-buffered في grep لإنهاء grep بعد المباراة الأولى في دفق مستمر.يجب أن يعمل هذا:

sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top