В моем 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
Как мне найти дочерний процесс Java внутри этого процесса Java? ⇐ Linux
-
Anonymous
1733976104
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);
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79273799/how-do-i-find-a-java-child-process-inside-this-java-process[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия