Java 프로그램 내에서 셸 명령을 실행하려고하면 이상한 문제가 있습니다. 나는 다음과 같은 권장 코드를 사용하여 수행하는 방법을 설명 수천 개의 웹 사이트가 존재하기 때문에 :셸 명령이 실행되지 않았습니다.
public String executeShellCommand (String command)
{
try
{
StringBuffer sb = new StringBuffer();
String line = "";
Process p = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(new InputStreamReader(
p.getInputStream()));
while ((line = reader.readLine()) != null)
sb.append(line + "\n");
p.waitFor();
return sb.toString();
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
Acutally를, 내가 예를 ls -aF
에 대한 실행하려고 할 때입니다 잘 작동하고 난 결과로 일부 출력을 얻을. 그러므로 나는 위의 코드가 원칙적으로 정확하다고 확신한다. 그러나, 나는 달리기를 원하고 출력으로 파일을 생성하는 또 다른 프로그램을 가지고있다. 위와 같은 방법으로 실행하고 싶지만 결코 실행되지 않으며 출력 파일도 생성되지 않습니다. 또한 나는 java에서 어떤 오류, 경고 또는 무엇이든을 얻지 않는다. 실제 command
인수 문자열을 복사하여 콘솔에 붙여 넣으면 쉘에서 직접 programm/명령을 실행해도 문제가 없으며 출력 파일이 생성됩니다. 그래서 내가이 방법으로 전달하는 명령도 정확합니다.
Java 내에서 셸 명령을 실행할 때주의해야 할 추가 사항이 있습니까?
업데이트 : 제안 사항에 따라 코드를 수정했습니다. 그러나 여전히 걸려 있습니다.
public String executeShellCommand(List<String> command, String logfile, boolean waitForProcess) { try {
ProcessBuilder pb = new ProcessBuilder(command);
System.out.println("pb.toString() = " + pb.toString());
Process p = pb.start();
System.out.println("2");
BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream()));
BufferedReader out = new BufferedReader(new InputStreamReader(p.getInputStream()));
System.out.println("3");
StringBuilder errSb = new StringBuilder();
StringBuilder outSb = new StringBuilder();
String line;
System.out.println("4");
while ((line = err.readLine()) != null) { // <--- code hangs here
errSb.append(line + "\n");
System.out.println("errSb = " + errSb.toString());
}
System.out.println("4a");
while ((line = out.readLine()) != null) {
outSb.append(line + "\n");
System.out.println("outSb = " + outSb.toString());
}
System.out.println("5");
if(waitForProcess) {
System.out.println("Wait for process");
p.waitFor();
} else {
System.out.println("Sleep 5000");
Thread.sleep(5000);
}
System.out.println("6");
//Log result to file
if(logfile != null) {
OutputStreamWriter outWriter = new OutputStreamWriter(new FileOutputStream(logfile));
outWriter.write(errSb.toString());
outWriter.close();
}
return errSb.toString();
} catch(Exception e) { e.printStackTrace(); } return null; }
오류 스트림을 기록하고 프로세스의 종료 값을 출력 해보십시오. –