powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Потоки. Отслеживание их выполнения.
10 сообщений из 10, страница 1 из 1
Потоки. Отслеживание их выполнения.
    #37576634
epan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача такова есть два похожих *.sh файла, нужно их запустить одновременно(потоки), сграбить аутпут с каждого скрипта.
Погуглил, создал два потока, запускаются одновременно(проверил через ps aux).
Но при попытке записать вывод - получаю результат только из первого шелла.
Подскажите плиз, где моя ошибка
Делаю так:
public static void main(String[] args) throws InterruptedException {
Thread th1 = new MyThread("test1.sh");
Thread th2 = new MyThread("test2.sh");
th1.start();
th2.start();
}
===
public MyThread(String str) {
super(str); }

public void run() {
try {
Process proc = Runtime.getRuntime().exec("/home/java/" + getName());
BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = new String();
while ((line = input.readLine()) != null) {
System.out.println("pr:" + getName()+ line);

}
input.close();
System.out.println("Proc exit value: " + proc.exitValue());
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
...
Рейтинг: 0 / 0
Потоки. Отслеживание их выполнения.
    #37576772
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Общие рекоммендации:
1) Вкурить статью http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1
2) Не использовать имя потока в качестве имени исполняемого файла

По делу:
1) Вместо Runtime использовать ProcessBuilder
2) Редиректить ErrorStream

Как вы понимаете, что аутпута со второго скрипта нет? Они же у вас пишутся в консоль вперемешку.
...
Рейтинг: 0 / 0
Потоки. Отслеживание их выполнения.
    #37577009
epan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenomОбщие рекоммендации:
1) Вкурить статью http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1
2) Не использовать имя потока в качестве имени исполняемого файла

Посмотрю.
По делу:
1) Вместо Runtime использовать ProcessBuilder
2) Редиректить ErrorStream

Спасибо, буду пробовать.
Как вы понимаете, что аутпута со второго скрипта нет? Они же у вас пишутся в консоль вперемешку.
Я знаю то что эти тесты должны выводить. Есть результат только первого. Хотя второй тоже отрабатывает успешно.
...
Рейтинг: 0 / 0
Потоки. Отслеживание их выполнения.
    #37577033
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
epanЕсть результат только первого. Хотя второй тоже отрабатывает успешно.Запустите сначала только первый потокЮ посмотрите на результат. Потом только второй поток, снова посмотрите на результат. Потом запустите их вместе и опять посмотрите на результат.
Мне кажется, тут могут быть следующие варианты:
1) Второй процесс не выдает вообще ничего, просто тихо исполняется
2) Второй процесс пишет в ErrorStream, а не в OutputStream
3) И первый и второй процессы все пишут нормально, просто вы их запускаете в параллель, результаты перемешиваются и вам кажется, что отработал только один
...
Рейтинг: 0 / 0
Потоки. Отслеживание их выполнения.
    #37578980
epan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Второй процесс не выдает вообще ничего, просто тихо исполняется
Так и есть.
2) Второй процесс пишет в ErrorStream, а не в OutputStream Тогда б файлики результата не создались, и проверка ps aux | grep ... не показывала б оба скрипта одновременно.
3) И первый и второй процессы все пишут нормально, просто вы их запускаете в параллель, результаты перемешиваются и вам кажется, что отработал только один Не перемешивается, так как я точно знаю вывод для каждого из них.
...
Рейтинг: 0 / 0
Потоки. Отслеживание их выполнения.
    #37579093
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть проблема решена?
...
Рейтинг: 0 / 0
Потоки. Отслеживание их выполнения.
    #37615180
epan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получилось что-то типа такого:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mysh;

/**
 *
 * @author max
 */
public class MySh {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        for (int i = 0; i<args.length;i++)
        {
              new SimpleThread(args[i]).start();
        }
       

    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mysh;

import java.io.*;
import javax.swing.text.View;

/**
 *
 * @author max
 */
public class SimpleThread extends Thread {

    public SimpleThread(String str) {
        super(str);
    }

    public void run() {
        System.out.println("DONE! " + getName());
        executeCommand(getName());
    }

    public void executeCommand(String str) {

        try {
            // Create file 
            FileWriter fstream = new FileWriter(str+".txt");
            BufferedWriter out = new BufferedWriter(fstream);
            
      
        String cmd = new String("ls -al");
        cmd = str;
        Runtime run = Runtime.getRuntime();
        Process pr = null;
        try {
            pr = run.exec(cmd);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            pr.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
        String line = "";
        try {
            while ((line = buf.readLine()) != null) {
               // System.out.println(line);
out.write(line+ "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        out.close();
        } catch (Exception e) {//Catch exception if any
            System.err.println("Error: " + e.getMessage());
        }
    }
}
...
Рейтинг: 0 / 0
Потоки. Отслеживание их выполнения.
    #37616302
epan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все хорошо оказалось в первом приближении. Если шелл выдает около 40к текста - успешно пишется в файл, а если более файл пустой...
...
Рейтинг: 0 / 0
Потоки. Отслеживание их выполнения.
    #37623636
epan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело не в файле. Дело в моем шелл скрипте.
Если я его руками запускаю - отрабатывает, выводит на экран, завершает корректно свою работу.
Если через программку (включил вывод на консоль) - выводит на экран (200к) все успешно и подвисает.
Пробовал сделать в шелле команду "cat filename" - без проблем обрабатывает большие файлы. Так что всем спасибо, буду разбираться со своим шеллом.
...
Рейтинг: 0 / 0
Потоки. Отслеживание их выполнения.
    #37623646
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
epanДело не в файле. Дело в моем шелл скрипте.
Если я его руками запускаю - отрабатывает, выводит на экран, завершает корректно свою работу.
Если через программку (включил вывод на консоль) - выводит на экран (200к) все успешно и подвисает.
Пробовал сделать в шелле команду "cat filename" - без проблем обрабатывает большие файлы. Так что всем спасибо, буду разбираться со своим шеллом.Вы точно из обоих стримов информацию вычитываете - и из основного и из ErrorStream?
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Потоки. Отслеживание их выполнения.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]