Как мне найти дочерний процесс Java внутри этого процесса Java?Linux

Ответить
Anonymous
 Как мне найти дочерний процесс Java внутри этого процесса Java?

Сообщение Anonymous »

В моем Java-коде я выполняю сценарий «bash subProgram.sh», используя Runtime.getRuntime().exec(), а в сценарии subProgram.sh поток засыпает на 60 с. поэтому после выполнения Java-процесса я запускаю терминал оболочки и выполняю «pstree -p $pid» (pid — это идентификатор процесса Java-процесса), чтобы получить это дерево процессов, например: java(125701)-+-bash (127307)---sleep(127308).
Но когда я выполняю команду "sudo pstree -p ${pid}" с Runtime.getRuntime().exec() внутри того же Java-процесса дерево процессов pstree выглядит следующим образом:
java(125701)-+-sudo(127300)---pstree(127301)
Почему это происходит и есть ли способ получить указанное выше дерево процессов bash-sleep внутри одного и того же Java-процесса
вот мой код:
Runtime rt = Runtime.getRuntime(); String[] arr = new String[]{"task_instance_id=11111111111", "key__state___11111111111"}; Process process = rt.exec("bash subProgram.sh", arr, new File("./"));
BufferedWriter bout = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
bout.flush();
bout.close();
SequenceInputStream sis = new SequenceInputStream(process.getInputStream(), process.getErrorStream());
InputStreamReader inst = new InputStreamReader(sis, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(inst);

String res;
StringBuilder sb = new StringBuilder();
while ((res = br.readLine()) != null) {
sb.append(res).append("\n");
}
br.close();
int exitValue = process.waitFor();
process.destroy();

System.out.println(sb);
System.out.println(exitValue);`

String psCmd = String.format("sudo ps -o pid= --ppid %s ", pid); String[] cmd = {"/bin/sh","-c", psCmd}; Process process = Runtime.getRuntime().exec(cmd, null, new File("./")); System.out.println("exe " + Arrays.toString(cmd)); SequenceInputStream sis = new SequenceInputStream(process.getInputStream(), process.getErrorStream()); InputStreamReader inst = new InputStreamReader(sis, StandardCharsets.UTF_8); BufferedReader br = new BufferedReader(inst);
String subPid;
List processIdList = new ArrayList();
while ((subPid = br.readLine()) != null) {
System.out.println("stdout: " + subPid);
if (subPid.trim().isEmpty()) {
break;
}
processIdList.add(subPid);
psCmdProcess(subPid);
getSubProcessId(subPid);
}
br.close();
final int exitValue = process.waitFor();
process.destroy();`

private static void psCmdProcess(String subPid) throws IOException {
String psCmd = String.format("sudo ps -ef |grep %s | grep -v grep", subPid);
String[] cmdArr = {"/bin/bash", "-c", psCmd};
System.out.printf("ps sub %s \n", Arrays.toString(cmdArr));
Process psSubProcess = Runtime.getRuntime().exec(cmdArr, null, new File("./"));
try (SequenceInputStream psSubIs = new SequenceInputStream(psSubProcess.getInputStream(), psSubProcess.getErrorStream());
InputStreamReader psSubInst = new InputStreamReader(psSubIs, StandardCharsets.UTF_8);
BufferedReader psSubBr = new BufferedReader(psSubInst)) {
String psSubResp;
while ((psSubResp = psSubBr.readLine()) != null) {
System.out.println("ps sub resp: " + psSubResp);
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... va-process
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»