[Java] Runtime.exec() stream

ได้งานประหลาดมาอย่างพี่บอกว่า process Java เปิด PIPE เต็มไปหมดหามาให้หน่อยเกิดจากอะไร ช่วยกันขุดไปมาสามคนสุดท้ายพบว่ามาจาก Runtime.exec() ที่เปิด Stream ให้ทีเดียว 3 Stream แล้วโค้ดเก่าที่เอามาใช้ดันปิดแค่อันเดียวที่ดึงผลลัพธ์ออกมา สิ่งที่เกิดขึ้นคือถ้า Process ทำงานไปเรื่อยๆ แล้วเรียก Runtime.exec() ซ้ำไปมา PIPE ก็จะโผล่ขึ้นมาเรื่อยๆ ประมาณนี้

# lsof -p 5344 | grep -i pipe
java    5344 root  228u  PIPE 0xffffff0001c76cb8        0         ->0xffffff0001c76b60
java    5344 root  229u  PIPE 0xffffff001289f158        0         ->0xffffff001289f000
java    5344 root  230u  PIPE 0xffffff006ac5a158        0         ->0xffffff006ac5a000
java    5344 root  231u  PIPE 0xffffff006ad3a430        0         ->0xffffff006ad3a2d8
java    5344 root  232u  PIPE 0xffffff006ad45cb8        0         ->0xffffff006ad45b60
java    5344 root  233u  PIPE 0xffffff006ad29708        0         ->0xffffff006ad295b0
java    5344 root  234u  PIPE 0xffffff00191d0430        0         ->0xffffff00191d02d8
java    5344 root  235u  PIPE 0xffffff0011013708        0         ->0xffffff00110135b0
java    5344 root  236u  PIPE 0xffffff006ad3c9e0        0         ->0xffffff006ad3c888
java    5344 root  237u  PIPE 0xffffff0001715430        0         ->0xffffff00017152d8
java    5344 root  238u  PIPE 0xffffff006ad6f708        0         ->0xffffff006ad6f5b0
java    5344 root  239u  PIPE 0xffffff0012625708        0         ->0xffffff00126255b0
java    5344 root  240u  PIPE 0xffffff006ad45000    16384         ->0xffffff006ad45158
java    5344 root  241u  PIPE 0xffffff001233ecb8        0         ->0xffffff001233eb60
java    5344 root  242u  PIPE 0xffffff0001a96cb8        0         ->0xffffff0001a96b60
java    5344 root  243u  PIPE 0xffffff006ad76430        0         ->0xffffff006ad762d8
java    5344 root  244u  PIPE 0xffffff006ad6c708        0         ->0xffffff006ad6c5b0
java    5344 root  245u  PIPE 0xffffff0012851cb8        0         ->0xffffff0012851b60
java    5344 root  246u  PIPE 0xffffff0001a96158        0         ->0xffffff0001a96000
java    5344 root  247u  PIPE 0xffffff006ad45708        0         ->0xffffff006ad455b0
java    5344 root  248u  PIPE 0xffffff006ad1dcb8        0         ->0xffffff006ad1db60
java    5344 root  249u  PIPE 0xffffff006ad3f2d8    16384         ->0xffffff006ad3f430, cnt=24, in=24
java    5344 root  250u  PIPE 0xffffff006ad71158        0         ->0xffffff006ad71000
java    5344 root  251u  PIPE 0xffffff0001c5e708        0         ->0xffffff0001c5e5b0
java    5344 root  252u  PIPE 0xffffff006ad0b158        0         ->0xffffff006ad0b000

วิธีแก้ก็ง่ายๆ ได้ Process ออกมาเสร็จใช้แล้วก็ปิด Stream ที่ให้มาด้วยซะ เช่นๆ

import ...

public class Sample {

  public void runCommand() {

    Process process Runtime.exec("ls");
    //... Print output ...

    process.getInputStream().close();
    process.getOuptutStream().close();
    process.getErrorStream().close();
  }

}

คำถามคือถ้าไม่ปิดจะเกิดอะไรขึ้นมั้ย จากเท่าที่สังเกตคือ ถ้าไม่ยอมปิดมันก็จะหายไปอย่างเงียบๆ เมื่อถึงเวลาหนึ่งแต่เพื่อความปลอดภัย ใช้แล้วก็ปิดเถอะ

About llun

Just a programmer

, ,

  • Dynaz

    แวะมาทักทาย บล็อค เพื่อนบ้านครับ เนื้อหา สาระดีคับ ^^

  • Dynaz

    แวะมาทักทาย บล็อค เพื่อนบ้านครับ เนื้อหา สาระดีคับ ^^

  • tap

    ไม่ว่าจะเรียก get หรือไม่ก็ตามเลยหรอครับ?

    • Anonymous

      ใช่ของเดิมคือ getInputStream มาอย่างเดียวแล้วก็ close ปรากฏว่าเหลือ pipe อีกสองอันค้างไว้อยู่

  • tap

    ไม่ว่าจะเรียก get หรือไม่ก็ตามเลยหรอครับ?

    • Anonymous

      ใช่ของเดิมคือ getInputStream มาอย่างเดียวแล้วก็ close ปรากฏว่าเหลือ pipe อีกสองอันค้างไว้อยู่