ได้งานประหลาดมาอย่างพี่บอกว่า 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(); } }
คำถามคือถ้าไม่ปิดจะเกิดอะไรขึ้นมั้ย จากเท่าที่สังเกตคือ ถ้าไม่ยอมปิดมันก็จะหายไปอย่างเงียบๆ เมื่อถึงเวลาหนึ่งแต่เพื่อความปลอดภัย ใช้แล้วก็ปิดเถอะ