java.io.IOException:无法运行程序"/“bin/bash”:错误=24,打开的文件太多
我使用线程通过终端连接java.io.IOException:无法运行程序"/“bin/bash”:错误=24,打开的文件太多,java,multithreading,bash,centos,processbuilder,Java,Multithreading,Bash,Centos,Processbuilder,我使用线程通过终端连接wmic,每5秒一次。但我得到了“java.io.IOException:无法运行程序”/bin/bash:error=24,打开的文件太多” 1天后 线程程序: public void run() { try { while (true) { if (isStopIssued()) { break; } setStatus("
wmic
,每5秒一次。但我得到了“java.io.IOException:无法运行程序”/bin/bash:error=24,打开的文件太多”
1天后
线程程序:
public void run() {
try {
while (true) {
if (isStopIssued()) {
break;
}
setStatus("SLEEP");
Thread.sleep(5000);
if (isStopIssued()) {
break;
}
setStatus("ACTIVE");
process();
if (isStopIssued()) {
break;
}
}
}
catch (InterruptedException e) {
logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
}
}
处理方法:
private void process() {
ProcessBuilder builder = new ProcessBuilder("/bin/bash");
Process p = null;
int exit = 0;
BufferedWriter p_stdin = null;
OutputStreamWriter osw = null;
String inDir = inputDir + "/" + inputFile;
String errDir = errorDir + "/" + errorFile;
String outDir = outputDir + "/" + outputFile;
logger.debug("[JWMILoader] - Input Directory ---> " + inDir);
logger.debug("[JWMILoader] - Output Directory ---> " + outDir);
logger.debug("[JWMILoader] - Error Directory ---> " + errDir);
File inFile = new File(inDir);
File errFile = new File(errDir);
try {
p = builder.redirectOutput(inFile).start(); **// Line Number : 194 **
p = builder.redirectError(errFile).start();
}
catch (IOException e) {
logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
}
osw = new OutputStreamWriter(p.getOutputStream());
// get standard input of shell
p_stdin = new BufferedWriter(osw);
// execute the desired command (here: wmic) n times
try {
// single execution
p_stdin.write(wmiQuery);
p_stdin.newLine();
p_stdin.flush();
}
catch (IOException e) {
logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
}
// finally close the shell by execution exit command
try {
p_stdin.write("exit");
p_stdin.newLine();
p_stdin.flush();
}
catch (IOException e) {
logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
}
finally {
try {
p_stdin.close();
exit = p.waitFor();
logger.debug("[JWMILoader] - WQL Query Successfully Executed. Process Exit ---> " + exit);
}
catch (IOException | InterruptedException e) {
logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
}
}
if (p != null) {
p.destroy();
}
}
例外情况:
java.io.IOException: Cannot run program "/bin/bash": error=24, Too many open files
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
at mavens.imlog.etl.loader.JWMILoader.remoteConnection(JWMILoader.java:194)
at mavens.imlog.etl.loader.JWMILoader.process(JWMILoader.java:156)
at mavens.imlog.etl.loader.JWMILoader.run(JWMILoader.java:64)
Caused by: java.io.IOException: error=24, Too many open files
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:135)
at java.lang.ProcessImpl.start(ProcessImpl.java:130)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022)
... 3 more
java.io.IOException:无法运行程序“/bin/bash”:错误=24,打开的文件太多
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
位于mavens.imlog.etl.loader.JWMILoader.remoteConnection(JWMILoader.java:194)
位于mavens.imlog.etl.loader.JWMILoader.process(JWMILoader.java:156)
位于mavens.imlog.etl.loader.JWMILoader.run(JWMILoader.java:64)
原因:java.io.IOException:error=24,打开的文件太多
位于java.lang.UNIXProcess.forkAndExec(本机方法)
位于java.lang.UNIXProcess(UNIXProcess.java:135)
在java.lang.ProcessImpl.start(ProcessImpl.java:130)
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1022)
... 3个以上
我使用的是分操作系统
请朋友们帮助我,如何解决这个问题。您启动流程两次
try {
p = builder.redirectOutput(inFile).**start()**; **// Line Number : 194 **
p = builder.redirectError(errFile).**start()**;
}
catch (IOException e) {
logger.error(this.getClass().getName() + ": " + e.getMessage(), e);
}
只摧毁最后一个创造出来的
if (p != null) {
p.destroy();
}
解决这个问题,这将解决您的错误
附言
只启动一次:
try {
builder = builder.redirectOutput(inFile);
p = builder.redirectError(errFile).start();
}
我怎样才能修好它。我使用不同的流程(或)使用相同的流程?假设我使用相同的进程方法,如何将其销毁两次?只启动一次:尝试{builder=builder.redirectOutput(infle);p=builder.redirectError(errFile.Start();}