Konsola - String

0

Hej :)
Mam problem, a że dopiero się uczę nie wiem jak go rozwiązać...
Może troszeczkę rozwinę opis sytuacji. Tak jak w temacie chodzi mi o przerzucenie tego co wyrzuci konsola systemu operacyjnego do zmiennej typu String.

Wcześniej poszperałem na forum w poszukiwaniu rozwiązania problemu, ale jest on różny w zależności od systemu na jakim pracujemy. Ja pracuję na systemie Linux Mint 11 bazującym na Ubuntu, a program piszę w NetBeans 6.9 IDE.

Teoretycznie program (tzn.jego część) powinna działać tak:
*a. Otwiera on konsole systemową i wpisuje w niej polecenie "ps -aux"(konsola = LXTerminal)
*b. W tym momencie konsola 'wywala' nam około 40 linijek tekstu (bo są to wszystkie uruchomione procesy) i mój program powinien zapisać to co wyrzucił terminal do zmiennej String, gdyż później program będzie przeszukiwać ten string w poszukiwaniu nazwy pewnego procesu... (mam nadzieję że to dobre rozwiązanie).

I moje pytanie jest następujące: Jakich bibliotek/something other użyć, aby program wykonał to, co ma wykonać?
Czy mogę użyć tej biblioteki? - http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html

0

nie możesz wyjścia tego programu przekierować do pliku, a potem odczytać jak zwykły plik?

0

A czemu nie zrobić po ludzku:
ps -aux | grep "NazwaProcesu"

0

@_13th_Dragon tak też można, ale wtedy kod programu będzie zajmować o wiele więcej miejsca, gdyż program takich procesów do wyszukania będzie miał koło 30...
Tzn. będzie on przeszukiwał String 30 razy i za każdym razem szukał innego procesu, a gdy znajdzie któryś z procesów to... to już tylko ja wiem co dalej będzie robił :P Ale dzięki za poinformowanie o takiej metodzie ;)

@matek3005 dzięki za radę, przyda się na pewno, ale chodzi mi o coś troszeczkę innego. Mianowicie: chodzi mi o moment w którym mój program otwiera konsole systemową, wpisuje w nią przykładowe "ps -aux" a później pobiera z konsoli zawartość tego co konsola wyrzuca z siebie tzn. pobiera listę uruchomionych procesów i zapisuje to do np. zmiennej String / pliku *txt czy czegokolwiek innego ... Jak to zrobić? :)

@Edit: Program nie posiada własnej konsoli. Ma on otworzyć konsolę załączoną do systemu operacyjnego Linux Mint 11 Katya ;)

0

No to potrzebujesz tego:
http://linux.die.net/man/2/pipe

0

@_13th_Dragon Wrzuciłem to co mi podałeś do czystego, nowo utworzonego pliku programu (*java) aby zobaczyć w jaki sposób to działa i zacząć na podstawie tego co zaobserwuje dostosowywać ten kod do własnych potrzeb... Skopiowałem przykład, podany na dole strony i NetBeans wywala mase błędów... Podejrzewam że nie zaimportowałem jakiejś biblioteki czy czegoś innego...
Jedyne co zmieniłem to stworzyłem metodę(a w nią wkleiłem kod z przykładu)

public static void main(String[] args)

a w kodzie utworzyłem String o nazwie TEST i zmieniłem jedną linijkę kodu, tj zamiast "string" wpisałem nazwę mojego Stringa czyli "TEST". ;)
Mam nadzieję że nie zrobiłem niczego złego :P

To jest fragment kodu, który zmieniłem:

fprintf(stderr, "Usage: %s <TEST>\n", argv[0]);
exit(EXIT_FAILURE);

A NetBeans przy próbie skompilowania oraz uruchomienia programu pokazuje coś takiego:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - not a statement
        at TESTING.TEST1.main(TEST1.java:11)
Java Result: 1

Czy mam utworzyć plik main.java? Jeśli tak to co mam w nim napisać, aby korzystał z tego co jest w TEST1.java lub odwrotnie?

I moje pytanie:
Tak więc co robię nie tak?'

0

Linie zaczynające się od at ... wskazują ci miejsca, przez które wyjątek był propagowany.
Odpowiedź jest prosta: zajrzyj w TEST1.java, metoda main, linijka 11.

0

@iooi dziękuje za wytłumaczenie ;)
W ogóle dziękuję wszystkim którzy udzielają się w temacie, że mi pomagacie, a nie odwracacie się do mnie plecami...

Ale mam pytanie... Co robię źle? Skoro skopiowałem kod z Example to przecież nie powinno być tam około 40 błędów! Dlatego się zastanawiam co zrobiłem źle... Nie zaimportowałem jakiegoś pakietu? Nie utworzyłem jakiejś zmiennej?
Nie chciałem tu wklejać spagetti kodu, ponieważ pewnie nie bylibyście tym zadowoleni, i zajęło by to za dużo miejsca... Dlatego daję odnośnik do zdjęcia z kodem ;)

Liczę na kolejną pomoc z Waszej strony :D
http://img407.imageshack.us/img407/2606/naforumi.png
Pozdrawiam :)

0
psc1997 napisał(a):

Liczę na kolejną pomoc z Waszej strony :D
http://img407.imageshack.us/img407/2606/naforumi.png
Pozdrawiam :)

a ty programujesz w java, C czy C++ bo się pogubiłem teraz ? ...

0

@matek3005 emmm... nie wiem czy można to programowaniem nazwać ale w Javie ;)
Dlatego też dodałem do tematu tag 'Java' ;)
Czyżby to co podał Dragon było napisane w C?

@Edit: też mi coś nie pasowało z tymi # na początku kodu, ale instrukcje if widziałem, int i string widziałem więc przymrużyłem oko na te płotki...

0
psc1997 napisał(a):

Czyżby to co podał Dragon było napisane w C?

ano o ile mnie wzrok nie myli to jest C :D

edit:
co prawda java nie jest mi bliska ale być może do tego co próbujesz osiągnąć może Ci się przydać:
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html

1

Ech, kombinujesz z tym.

Process ps = new ProcessBuilder("ps", "-aux").start();
BufferedReader reader = new BufferedReader(new InputStreamReader(ps.getInputStream()));

String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
0

@iooi Bardzo Ci dziękuję za pomoc. Twój login na pewno zostanie wymieniony gdzieś tam w autorach i podziękowaniach, oczywiście jeśli się zgodzisz ;)

Ale mam pytanie... Wg. kodu który wkleiłeś, dlaczego zmienna 'line' posiada listę uruchomionych procesów tylko w pętli while? Poza pętlą zmienna 'line' nie istnieje, a gdy chcę ją wyświetlić program wywala wartość null... Co zrobić, aby line wyświetliło się poza pętlą?
Jest mi to potrzebne, ponieważ chciałbym zapisać w/w zmienną do pliku txt :)

1

Do zmiennej line przypisywane są w pętli po kolei wszystkie linie odczytane z tego, co zwróci polecenie. Odczytywanie trwa dotąd, aż reader.readLine() zwróci null, czyli EOF, koniec danych. Oczywiście wcale nie musisz wczytywać po linii, możesz nawet od razu wyjście polecenia przekierować do pliku. Jeśli chcesz przetwarzać te linie, to rób to w pętli:

Process ps = new ProcessBuilder("ps", "-aux").start();
BufferedReader reader = new BufferedReader(new InputStreamReader(ps.getInputStream()));

List<String> processList = new LinkedList<String>();
StringBuilder processLinesBuilder = new StringBuilder();

String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);                       // tutaj, dla przykładu, wypisywanie
    processList.add(line);                          // tutaj dodawanie do listy procesów
    processLinesBuilder.append(line).append('\n');  // tutaj sklejanie wszystkiego w jeden string
}

String processLines = processLinesBuilder.toString();  // tutaj masz wszystko w jednym stringu

for (String process : processList) {
    // tutaj możesz każdą linię przetwarzać oddzielnie
}

Files.write(Paths.get("plik.txt"), processList, defaultCharset());  // tutaj zapisywanie wszystkich linii do pliku
                                                                    // (tylko wersja JDK 7)
0

Nie chce mi się sprawdzać, ale jesteście pewni, że ps.getInputStream() a nie ps.getOutputStream() ? ;p

1 użytkowników online, w tym zalogowanych: 0, gości: 1