بروسيسبيلدر جيتوتبوتستريم والتفاعل مع العمليات

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

  •  28-10-2019
  •  | 
  •  

سؤال

أواجه مشكلة في التفاعل مع عملية باستخدام جيتوتبوتستريم.هنا هو رمز بلدي:

    Process p = null;
    ProcessBuilder pb = new ProcessBuilder("/home/eric/this.sh");
    pb.directory(new File("/home/eric/"));
    p = pb.start();

    InputStream in = null;
    OutputStream outS = null;

    StringBuffer commandResult = new StringBuffer();
    String line = null;
    int readInt;

    int returnVal = p.waitFor();

    in = p.getInputStream();

    while ((readInt = in.read()) != -1)
        commandResult.append((char)readInt);
    outS = (BufferedOutputStream) p.getOutputStream();
    outS.write("Y".getBytes());
    outS.close();

    System.out.println(commandResult.toString());
    in.close();

هنا هو الإخراج:

Reading package lists...
Building dependency tree...
Reading state information...
The following packages were automatically installed and are no longer required:
  libmono2.0-cil libmono-data-tds2.0-cil libmono-system-data2.0-cil
  libdbus-glib1.0-cil librsvg2-2.18-cil libvncserver0 libsqlite0
  libmono-messaging2.0-cil libmono-system-messaging2.0-cil
  libmono-system-data-linq2.0-cil libmono-sqlite2.0-cil
  libmono-system-web2.0-cil libwnck2.20-cil libgnome-keyring1.0-cil
  libdbus1.0-cil libmono-wcf3.0-cil libgdiplus libgnomedesktop2.20-cil
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
  firefox-globalmenu
Suggested packages:
  firefox-gnome-support firefox-kde-support latex-xft-fonts
The following NEW packages will be installed:
  firefox firefox-globalmenu
0 upgraded, 2 newly installed, 0 to remove and 5 not upgraded.
Need to get 15.2 MB of archives.
After this operation, 30.6 MB of additional disk space will be used.
Do you want to continue [Y/n]? Abort

this.sh ببساطة يدير "غسودو الرابطة بين الحصول على تثبيت فايرفوكس"

لا أعرف لماذا يتم إجهاضه وعدم أخذ مدخلاتي" ص " شكرا.

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

المحلول

هناك العديد من المشاكل.

أولا: gksudo(1) يقوم ببعض الحيل القذرة وغير القياسية مع الإدخال القياسي والإخراج القياسي للأوامر التي يبدأ بها.فشل الرهيبة.وخير مثال على ذلك هو سطر الأوامر هذا:

$ echo foo | gksudo -g cat

أتوقع أي إخراج وإنهاء cat بمجرد أن echo وقد سلمت البيانات.كلا.كلاهما gksudo و cat تسكع إلى الأبد.لا الإخراج.

حالة الاستخدام الخاصة بك ستكون

echo y |gksudo apt-get install ....

وهذا لن يعمل أيضا.طالما لم يتم حل هذا ، يمكنك نسيان القيام بأي جهاز تحكم عن بعد إذا كان البرنامج الذي بدأ يتطلب أي إدخال المستخدم.

ثانيا:كما سبق أن أشار روجر waitFor() ينتظر إنهاء الأمر.هذا لن يحدث في أي وقت قريب دون أي إدخال المستخدم ومع مشكلة غسودو.

ثالثا بعد تدافع waitFor أسفل قليلا هناك مانع المقبل:أنت تنتظر اكتمل إخراج عملية تصل إلى وبما في ذلك إوف.لن يحدث هذا في أي وقت قريب (انظر "الأول" و "الثاني").

الرابعة فقط بعد العملية ميتة بالفعل مرتين (انظر "الثانية" و "الثالثة") قد تحصل على بعض المدخلات-الخاص بك Y (والتي قد تحتاج أيضا إلى إضافية \n).


بدلا من حل هذه المجموعة من المشاكل ، قد تكون هناك طريقة أفضل وأسهل بكثير:لا تحاول السيطرة apt-get install مع المدخلات القياسية.ما عليك سوى إعطائها بعض الخيارات المناسبة التي "تجيب" تلقائيا على أسئلتك.سريع man apt-get يحضر بعض المرشحين:

-y, --yes, --assume-yes
--force-yes
--trivial-only
--no-remove
--no-upgrade

راجع الدليل للحصول على التفاصيل.

أعتقد أن هذه هي الطريقة الأفضل والأكثر استقرارا.

بس:الآن أنا بي * * * س*** gksudo قليلا جدا ، لذلك عذر التشدق أعلاه.

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