Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Потоки. Отслеживание их выполнения. / 10 сообщений из 10, страница 1 из 1
15.12.2011, 01:38:58
    #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
15.12.2011, 09:08:26
    #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
15.12.2011, 11:01:42
    #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
15.12.2011, 11:09:48
    #37577033
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки. Отслеживание их выполнения.
epanЕсть результат только первого. Хотя второй тоже отрабатывает успешно.Запустите сначала только первый потокЮ посмотрите на результат. Потом только второй поток, снова посмотрите на результат. Потом запустите их вместе и опять посмотрите на результат.
Мне кажется, тут могут быть следующие варианты:
1) Второй процесс не выдает вообще ничего, просто тихо исполняется
2) Второй процесс пишет в ErrorStream, а не в OutputStream
3) И первый и второй процессы все пишут нормально, просто вы их запускаете в параллель, результаты перемешиваются и вам кажется, что отработал только один
...
Рейтинг: 0 / 0
16.12.2011, 02:32:08
    #37578980
epan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки. Отслеживание их выполнения.
1) Второй процесс не выдает вообще ничего, просто тихо исполняется
Так и есть.
2) Второй процесс пишет в ErrorStream, а не в OutputStream Тогда б файлики результата не создались, и проверка ps aux | grep ... не показывала б оба скрипта одновременно.
3) И первый и второй процессы все пишут нормально, просто вы их запускаете в параллель, результаты перемешиваются и вам кажется, что отработал только один Не перемешивается, так как я точно знаю вывод для каждого из них.
...
Рейтинг: 0 / 0
16.12.2011, 09:04:46
    #37579093
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки. Отслеживание их выполнения.
То есть проблема решена?
...
Рейтинг: 0 / 0
15.01.2012, 15:13:33
    #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
16.01.2012, 14:49:00
    #37616302
epan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки. Отслеживание их выполнения.
Все хорошо оказалось в первом приближении. Если шелл выдает около 40к текста - успешно пишется в файл, а если более файл пустой...
...
Рейтинг: 0 / 0
20.01.2012, 11:27:19
    #37623636
epan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки. Отслеживание их выполнения.
Дело не в файле. Дело в моем шелл скрипте.
Если я его руками запускаю - отрабатывает, выводит на экран, завершает корректно свою работу.
Если через программку (включил вывод на консоль) - выводит на экран (200к) все успешно и подвисает.
Пробовал сделать в шелле команду "cat filename" - без проблем обрабатывает большие файлы. Так что всем спасибо, буду разбираться со своим шеллом.
...
Рейтинг: 0 / 0
20.01.2012, 11:33:04
    #37623646
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потоки. Отслеживание их выполнения.
epanДело не в файле. Дело в моем шелл скрипте.
Если я его руками запускаю - отрабатывает, выводит на экран, завершает корректно свою работу.
Если через программку (включил вывод на консоль) - выводит на экран (200к) все успешно и подвисает.
Пробовал сделать в шелле команду "cat filename" - без проблем обрабатывает большие файлы. Так что всем спасибо, буду разбираться со своим шеллом.Вы точно из обоих стримов информацию вычитываете - и из основного и из ErrorStream?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Потоки. Отслеживание их выполнения. / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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