لدي خدمة في بعض الأحيان يدعو ملف دفعي. يستغرق ملف الدفعات 5-10 ثوان لتنفيذ: الملف موجود وتعمل التعليمات البرمجية عند تشغيل نفس التعليمات البرمجية في وحدة التحكم. ولكن عندما يتم تشغيله داخل الخدمة، فإنه معلقة في ويتفوريكسيت (). لا بد لي من قتل ملف دفعي من عملية من أجل الاستمرار. (أنا متأكد من وجود الملف، كما أستطيع أن أرى ذلك في قائمة العمليات.) كيف يمكنني إصلاح هذا شنق المتابعة تحديث 1: كود كيفنس يسمح لي للحصول على الإخراج. لا تزال إحدى ملفات الدفعات معلقة. C: EnterpriseDBPostgres8.3binpgdump. exe - i - h لوكالهوست - p 5432 - U بوستغريز - F p - a - D - v - fc: backupcasecocherbackupdateevent2008.sql - t public. dateevent دبتيست ملف الدفعات الأخرى هو: C: EnterpriseDBPostgres8.3binvacuumdb. exe - U بوستغريس - d دبتيست لقد فحصت المسار ومسار بوستغريزل على ما يرام. دليل الإخراج موجود ولا يزال يعمل خارج الخدمة. أي أفكار التحديث 2: بدلا من مسار ملف الدفعي، كتبت C: EnterpriseDBPostgres8.3binpgdump. exe ل proc. StartInfo. FileName وأضاف كافة المعلمات إلى proc. StartInfo. Arguments. النتائج دون تغيير، ولكن أرى pgdump. exe في إطار العملية. مرة أخرى هذا يحدث فقط داخل الخدمة. التحديث 3: لقد قمت بتشغيل الخدمة مع مستخدم في مجموعة المسؤول، دون جدوى. أنا استعادة فارغة ل اسم المستخدم وكلمة المرور الخدمات تحديث 4: أنا خلقت خدمة بسيطة لكتابة أثر في سجل الأحداث وتنفيذ ملف دفعي يحتوي على دير في ذلك. وسوف يعلق الآن في proc. Start () - حاولت تغيير الحساب من لوكالزيستم للمستخدم وأنا تعيين المستخدم أدمنيستراتور وكلمة المرور، لا يزال شيئا. استخدام النظام باستخدام System. Collections. Generic باستخدام System. Linq باستخدام System. Text باستخدام System. Diagnostics مساحة الاسم فغ سلسلة تارجيتدير سلسلة. Format (D: أدابتيرسيتوب) هذا هو المكان mybatch. bat يكمن بروك عملية جديدة () proc. StartInfo. WorkingDirectory تارجيتدير بروك. StartInfo. FileName mybatch. bat proc. StartInfo. Arguments string. Format (10) هذه هي الوسيطة proc. StartInfo. CreateNoWindow كاذبة بروك. بدء () proc. WaitForExit () الصيد (استثناء السابق)، ex. Message، السابق. StackTrace. ToString ()) أجاب في 7 يناير 10 في 9:47 ماذا يفعل ملف الدفعات هل أنت متأكد من الحصول على العملية مع ما يكفي من الخصومات لتنفيذ ملف دفعي يمكن أن تكون الخدمات محدودة في ما يسمح لهم القيام به. تأكد أيضا إذا كنت تفعل شيئا مثل وسين الأمر نسخة إلى الكتابة فوق ملف أن تفعل شيئا من هذا القبيل: أيضا، تأكد من أنك تستخدم مسارات كاملة لأوامر دفعة، وما إذا كان ملف دفعي هو إطلاق التطبيق واجهة المستخدم الرسومية في بعض نوع من وضع وحدة التحكم، التي قد تكون مشكلة أيضا. تذكر أن الخدمات لا تملك سطح المكتب (إلا إذا قمت بتمكين التفاعل مع سطح المكتب) لرسم أي نوع من النوافذ أو مربعات الرسالة ل. في البرنامج الخاص بك، قد ترغب في فتح ستدوت وأنابيب ستدير وقراءة منها أثناء التنفيذ في حال كنت تحصل على أي رسائل خطأ أو أي شيء. من المحتمل أن يتم تنفيذ ويبسرفيسز كحساب يوسر، أو حساب مجهول، أي وقت مضى، بحيث قد يكون مشكلة بالنسبة لك. إذا كان يعمل عند تشغيله في وحدة التحكم، هذه ليست سوى الخطوة الأولى. ) أنا لا أذكر إذا System. Diagnostics. تتوفر فقط في التصحيح أم لا. ربما لا، ولكن بعضها قد يكون. إل يجب أن تحقق على ذلك بالنسبة يا. نأمل أن يعطيك هذا بعض الأفكار. أجاب ديك 11 08 في 21:58 pgdump. exe هو على الارجح المطالبة لإدخال المستخدم. هل تتطلب قاعدة البيانات هذه المصادقة هل أنت تعتمد على أي متغيرات البيئة التي لن تكون موجودة للخدمة أنا لا أعرف بدومب ولكن ما هي الأسباب المحتملة الأخرى أنها سوف تدفع لإجابة المدخلات ديسمبر 12 08 في 15:10 يمكنني أن أفعل هذا الأمر من سطر الأوامر من cmd. exe وأنه لا يعمل دون المطالبة. نداش باتريك ديزجاردينز ديك 12 08 في 15:25 الخطوة التالية التي سوف تتخذها هو اطلاق النار حتى المصحح، ومعرفة ما اذا كان يمكنك معرفة ما ينتظر البرنامج على. إذا كنت إكسيرنسد في التصحيح في التجمع، قد تكون قادرة على الحصول على إيديا من ماذا يحدث باستخدام أدوات مثل بروكسيكس، فليمون، الخ كونها خدمة ويندوز، وليس خدمة ويب، يجعل قليلا جدا من الفرق. على أي حال، هل حاولت اقتراحي من "السماح خدمة" للتفاعل مع سطح المكتب إذا كنت يائسة، قد تحاول إطلاق cmd. exe بدلا من ملف دفعي. ثم، باستخدام المعلمات سمد cmd. exes سمد، هل يمكن أن يكون إيت بدء تشغيل ملف دفعي. هذا ربما تعطيك نافذة موجه سمد لعرض الإخراج الفعلي، إذا قمت بتشغيل التفاعل مع سطح المكتب. للحصول على مساعدة كاملة على cmd. exe، اكتب سمد فقط في أي موجه الأوامر. الشفرة يشبه تقريبا هذا: كما ترون، التعليمات البرمجية يبدأ عملية cmd. exe ويمر إليها الأمر أريد أن يتم تنفيذها. إعادة توجيه ستانداردرور و ستاندارتبوت من أجل قراءتها من التعليمات البرمجية. قراءة التعليمات البرمجية لهم قبل العملية. مكالمة ويتيفوريكسيت (مهلة) كما أوصت بها ميكروسوفت (المزيد عن هذا لاحقا). تنشأ المشكلة إذا كان الأمر الذي أرسله إلى cmd. exe لا ينتهي أبدا أو تعليق إلى أجل غير مسمى. في التعليمات البرمجية استخدم الأمر بينغ - t 8.8.8.8 الذي، بسبب الخيار - t، بينغ المضيف دون توقف. ماذا يحدث عملية cmd. exe جنبا إلى جنب مع الأمر بينغ - t أبدا يخرج ويغلق أبدا ستدوت تيار وهكذا التعليمات البرمجية الخاصة بك معلقة في خط الانتاج. StandardOutput. ReadToEnd () لأنه لا يمكن أن تنجح قراءة كل تيار. يحدث نفس الشيء أيضا إذا كان الأمر في ملف دفعي يعلق لأي سبب من الأسباب، وبالتالي فإن التعليمات البرمجية أعلاه يمكن أن تعمل بشكل مستمر لسنوات ثم تعليق فجأة دون أي سبب واضح. قبل أن أكتب أن الموصى بها لقراءة تيارات إعادة توجيه قبل العملية. استدعاء ويتفوريكسيت (المهلة)، حسنا هذا صحيح بشكل خاص إذا كنت تستخدم توقيع ويتفوريكسيت دون مهلة. إذا قمت بالاتصال بعملية. ويتفوريكسيت () قبل قراءة تيارات إعادة توجيه: التعليمات البرمجية 2: يمكنك تجربة حالة توقف تام إذا كان الأمر الذي تعلقه إلى cmd. exe أو العملية التي تتصل بها يملأ الإخراج القياسية أو خطأ قياسي. هذا لأن التعليمات البرمجية لدينا يمكن أن تصل إلى خطوط عملية الإخراج. ستانداردوتبوت. ريادتويند () في واقع الأمر عملية الطفل (الأمر بينغ أو ملف دفعي أو أي عملية كنت تنفذ) لا يمكن المضي قدما إذا برنامجنا لا يقرأ مخازن عازلة من تيارات وهذا لا يمكن أن يحدث لأن التعليمات البرمجية معلقة في الخط مع العملية. ويتفوريكسيت () والتي سوف تنتظر إلى الأبد لمشروع الطفل للخروج. الحجم الافتراضي لكل من تيارات هو 4096 بايت. يمكنك اختبار هذه الأحجام اثنين مع هذه الملفات دفعة: يكتب السيناريو الأول 4096 بايت إلى الإخراج القياسية والثانية إلى الخطأ القياسي. حفظ واحد من هذه في C: testbuffsize. bat وتشغيل عملية الاتصال البرنامج. ويتفوريكسيت () قبل عملية الإخراج. ستانداردوتبوت. ريادتويند () كما هو الحال في الكود 2. يمكنك القيام بذلك كتابة كوماندرسولت نتيجة إكسكوتشيلكوماندسينك (c: testbuffsize. bat، 1000) في السطر 13 من التعليمات البرمجية 1. التعليمات البرمجية لن تتوقف ولكن إذا قمت بكتابة بايت واحد أكثر في أي من تيارات اثنين سوف تجاوز حجم المخزن المؤقت جعل البرنامج تعليق. إذا كنت بحاجة إلى إعادة توجيه وقراءة الإخراج القياسية أو خطأ القياسى الحل الأفضل هو قراءتها بشكل غير متزامن. طريقة ممتازة للقيام بذلك يقترحها مارك بييرز في هذا الموضوع ستاكوفيرفلو كما آخر شيء يرجى ملاحظة أنه إذا كان مخارج عملية الطفل فقط لأنك تستخدم هذه العملية. ويتفوريكسيت (مهلة) التوقيع ويذهب في الواقع في مهلة يجب أن تقتل عملية cmd. exe وأطفالها المحتملين.
No comments:
Post a Comment