سؤال

لدي تنفيذ (سلسلة CMD) في برنامج نصي JSP يدعو طريقة EXEC من فئة وقت التشغيل.

إنه يعمل عندما أتصل بأمر محلي ، مثل برنامج نصي PHP مخزّن على الخادم. على سبيل المثال:/usr/bin/php/path/to/php/script arg1 arg2

لذلك أعتقد أن أمر التنفيذ الخاص بي على ما يرام ، لأنه يعمل مع ذلك.

الآن عندما أحاول الاتصال بـ Lynx ، متصفح الويب المستند إلى النص ، فإنه لا يعمل.

إذا أسميتها في محطة ، فهي تعمل بشكل جيد:/usr/bin/lynx -dump -accept_all_cookieshttp://www.someurl.net/؟arg1=1&arg2=2'

ولكن عندما أسمي هذا من أمر التنفيذ الخاص بي ، لا شيء يحدث ...

أي فكرة لماذا؟

هذه طريقة التنفيذ الخاصة بي:

public String execute(String cmd){


        Runtime r = Runtime.getRuntime();
        Process p = null;
        String res = "";

        try {
                    p = r.exec(cmd);
                    InputStreamReader isr = new InputStreamReader(p.getInputStream());
                    BufferedReader br = new BufferedReader(isr);
                    String line = null;
                    //out.println(res);
                    while ((line = br.readLine()) != null) {

                    res += line;

                    }
                    p.waitFor();
                    } catch (Exception e) {
                    res += e;
                    }
                    System.out.println(p.exitValue());

        return res;

    }
هل كانت مفيدة؟

المحلول 2

لقد قمت بحلها .... عن طريق الاتصال بـ Lynx في برنامج نصي PHP ، نص PHP الذي اتصلت به من البرنامج النصي JSP ...

إنه حل غزير ولكنه على الأقل يعمل ... ما زلت لا أفهم حقًا سبب عمل أمر exec من Java بهذه الطريقة ...

شكرا لمساعدتكم على أي حال Andrzej (التشيكي أعتقد من الاسم ..؟ ^_ ^) ، بطريقة ما وضعتني في الطريق!

نصائح أخرى

تحتاج إلى القراءة من Processدفق الإخراج.

نظرًا لأنك لست كذلك ، فمن المحتمل أن تكون عملية Lynx الأساسية تمنع أثناء كتابة الإخراج ، في انتظار أن يفرق شخص ما المخزن المؤقت لتيار المخرجات. حتى لو كنت ستتجاهل الإخراج ، فأنت بحاجة إلى قراءته على أي حال لتنفيذ العملية كما تتوقع.

كما Javadocs من العملية قل ، "نظرًا لأن بعض المنصات الأصلية توفر فقط حجمًا محدودًا للمخزن المؤقت لتيارات الإدخال والإخراج القياسية ، فإن الفشل في كتابة دفق الإدخال على الفور أو قراءة دفق الإخراج للعملية الفرعية قد يتسبب في حظر العمليات الفرعية ، وحتى حالة deadlock."

نرى http://www.javaworld.com/javaworld/jw-12-2000/jw-1229raps.html لبعض الأمثلة على كيفية التعامل مع هذا.

تحرير: في حال كنت تتساءل ، هناك احتمالات أنه عندما تستدعي البرنامج النصي PHP ، فإنه لم ينتج قدرًا كبيرًا من الإخراج ، وبالتالي تمكنت من الإنهاء قبل ملء المخزن المؤقت للإخراج والحظر. من المفترض أن يكون الأمر Lynx ينتج المزيد من الإخراج وبالتالي ضرب هذه المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top