java linux uruchomienie skryptu bash

0

Witam potrzebuję uruchomić skrypt bash -a z poziomu javy bardzo prościutki

 free | grep Mem:

w linux ale sktypt nie może być wczytywany w pliku tak jak tutaj

 Process proc=Runtime.getRuntime().exec("/home/darek/test/./bash.sh");
       
       BufferedReader read=new BufferedReader(new InputStreamReader(proc.getInputStream()));
       try
       {
         Thread.sleep(20);        
              
             }catch (InterruptedException ie)
             {
         System.out.println(ie.getMessage());
             }
         
       while(read.ready())
       {
       	//int wart = Integer.parseInt(read.readLine());
       	System.out.println(read.readLine());
       	
       }
       }
       catch(IOException e)
       {
       System.out.println(e.getMessage());
       }

bo wtedy muszą być ustawione parawa wykonywania.
natomiast uruchomienie skryptu następująco

  try {
    	 Process proc = Runtime.getRuntime().exec("free | grep Mem:");
         
         BufferedReader read=new BufferedReader(new InputStreamReader(proc.getInputStream()));
         
      while(read.ready())
      {
      	//int wart = Integer.parseInt(read.readLine());
      	System.out.println(read.readLine());
      	
      }
      }
      catch(IOException e)
      {
      System.out.println(e.getMessage());
      }

wykonuje się tylko free a dalsze grep nie działa. Proszę o odpowiedz jak uruchomić

0

Spróbuj wywołać bash'a i przekazać mu po argumencie "-c" polecenie do wywołania.

bash -c "free|grep Mem:"

Natomiast skrypt bez uprawnień do uruchomiania możesz wywołać tak:

bash ./skrypt_bez_uprawnien.sh
lub tak (kropka na początku to alias do "bash")
. ./skrypt_bez_uprawnien.sh

0

Dzięki __krzysiek85 za odpowiedz. Wywołanie bash -c nie wiem dlaczego nie chce działać. Co robię źle kod jest poniżej. Z góry dzięki za odpowiedz

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class foo
{
  

   public static void main( String args[] )
   {
	   String skrypt  = "bash -c \"free|grep Mem:\"";
	   

     try {
    	 Process proc = Runtime.getRuntime().exec(skrypt);        
         BufferedReader read=new BufferedReader(new InputStreamReader(proc.getInputStream()));
         
      while(read.ready())
      {
      	//int wart = Integer.parseInt(read.readLine());
      	System.out.println(read.readLine());
      	
      }
      }
      catch(IOException e)
      {
      System.out.println(e.getMessage());
      }
      
      
   }
}
0

Spróbuj tak:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class foo {

	public static void main(String args[]) {
		try {
			Process proc = Runtime.getRuntime().exec(new String[] { "bash", "-c", "free|grep Mem:" });
			BufferedReader read = new BufferedReader(new InputStreamReader(proc.getInputStream()));

			String line;
			while (null != (line = read.readLine())) {
				System.out.println(line);
			}
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}

	}
}

Nie można tego zapisać w jednym napisie z powodu spacji pomiędzy "grep" i "Mem:".

Komeda dzielona jest na takie części:
bash
-c
"free|grep
Mem:"

0

Teraz działa super wielkie dzięki

0

Dlaczego gdy wykonuje skrypt bash z poziomu javy w którym jest tylko top -n 1 to nie dostaje zednego wyniku a gdy w skrypcie dam np free to dostaje wyniki a uruchamiam nastepująco

Process proc=Runtime.getRuntime().exec("/home/darek/test/./bash.sh");
       
       BufferedReader read=new BufferedReader(new InputStreamReader(proc.getInputStream()));
       try
       {
         Thread.sleep(20);       
             
             }catch (InterruptedException ie)
             {
         System.out.println(ie.getMessage());
             }
         
       while(read.ready())
       {
               //int wart = Integer.parseInt(read.readLine());
               System.out.println(read.readLine());
               
       }
       }
       catch(IOException e)
       {
       System.out.println(e.getMessage());
       }

0

Domyślnie top działa w trybie interaktywnym (pozwala na wykonywanie akcji i zmianę ustawień już po uruchomieniu za pomocą specjalnych klawiszy).
Aby to osiągnąć wysyła specjalne sekwencje sterujące do terminala. Sekwencje te nie są wypisywane użytkownikowi. Można je jednak podejrzeć programem vi.

Tryb interaktywny możńa wyłączyć przełącznikiem -b.

top -n 1 > ./tmp
vi ./tmp

^[[H^[[2J^[[m^[(Btop - 13:29:11 up 52 min,  2 users,  load average: 0.33, 0.23, 0.13^[[m^[(B^[[39;49m^[[K
Tasks:^[[m^[(B^[[39;49m^[[m^[(B 157 ^[[m^[(B^[[39;49mtotal,^[[m^[(B^[[39;49m^[[m^[(B   1 ^[[m^[(B^[[39;49mrunning,^[[m^[(B^[[39;49m^[[m^[(B 156 ^[[m^[(B^[[39;49msleeping,^[[m^[(B^[[39;49m^[[m^[(B   0 ^[[m^[(B^[[39;49mstopped,^[[m^[(B^[[39;49m^[[m^[(B   0 ^[[m^[(B^[[39;49mzombie^[[m^[(B^[[39;49m^[[K
Cpu(s):^[[m^[(B^[[39;49m^[[m^[(B 27.9%^[[m^[(B^[[39;49mus,^[[m^[(B^[[39;49m^[[m^[(B  4.9%^[[m^[(B^[[39;49msy,^[[m^[(B^[[39;49m^[[m^[(B  0.7%^[[m^[(B^[[39;49mni,^[[m^[(B^[[39;49m^[[m^[(B 63.9%^[[m^[(B^[[39;49mid,^[[m^[(B^[[39;49m^[[m^[(B  2.3%^[[m^[(B^[[39;49mwa,^[[m^[(B^[[39;49m^[[m^[(B  0.1%^[[m^[(B^[[39;49mhi,^[[m^[(B^[[39;49m^[[m^[(B  0.1%^[[m^[(B^[[39;49msi,^[[m^[(B^[[39;49m^[[m^[(B  0.0%^[[m^[(B^[[39;49mst^[[m^[(B^[[39;49m^[[K
Mem: ^[[m^[(B^[[39;49m^[[m^[(B  2060240k ^[[m^[(B^[[39;49mtotal,^[[m^[(B^[[39;49m^[[m^[(B  1423920k ^[[m^[(B^[[39;49mused,^[[m^[(B^[[39;49m^[[m^[(B   636320k ^[[m^[(B^[[39;49mfree,^[[m^[(B^[[39;49m^[[m^[(B   216672k ^[[m^[(B^[[39;49mbuffers^[[m^[(B^[[39;49m^[[K
Swap:^[[m^[(B^[[39;49m^[[m^[(B   947792k ^[[m^[(B^[[39;49mtotal,^[[m^[(B^[[39;49m^[[m^[(B        0k ^[[m^[(B^[[39;49mused,^[[m^[(B^[[39;49m^[[m^[(B   947792k ^[[m^[(B^[[39;49mfree,^[[m^[(B^[[39;49m^[[m^[(B   525852k ^[[m^[(B^[[39;49mcached^[[m^[(B^[[39;49m^[[K
^[[6;1H
^[[7m  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                             ^[[m^[(B^[[39;49m^[[K
^[[m^[(B 2597 krzysiek  20   0 1104m 459m  38m S   81 22.8  33:20.63 firefox                                                                                                             ^[[m^[(B^[[39;49m
^[[m^[(B 1442 root      20   0  310m  41m  13m S   12  2.1   2:00.17 Xorg                                                                                                                ^[[m^[(B^[[39;49m
^[[m^[(B 2382 krzysiek  20   0  155m 4572 3484 S    4  0.2   0:24.77 pulseaudio                                                                                                          ^[[m^[(B^[[39;49m
^[[m^[(B 3178 krzysiek  20   0 56200  14m  10m S    2  0.7   0:01.53 gnome-terminal                                                                                                      ^[[m^[(B^[[39;49m
^[[m^[(B^[[m^[(B 3249 krzysiek  20   0  2464 1080  784 R    2  0.1   0:00.01 top                                                                                                                 ^[[m^[(B^[[39;49m
^[[m^[(B    1 root      20   0  3420 1592 1120 S    0  0.1   0:01.01 init           

top -b -n 1 > ./tmp
vi ./tmp

top - 13:25:03 up 48 min,  2 users,  load average: 0.08, 0.03, 0.07
Tasks: 157 total,   4 running, 153 sleeping,   0 stopped,   0 zombie
Cpu(s): 27.0%us,  4.9%sy,  0.8%ni, 64.5%id,  2.5%wa,  0.1%hi,  0.1%si,  0.0%st
Mem:   2060240k total,  1421628k used,   638612k free,   216096k buffers
Swap:   947792k total,        0k used,   947792k free,   525656k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2597 krzysiek  20   0 1104m 457m  38m S   82 22.7  29:56.81 firefox
 1442 root      20   0  310m  41m  13m R    6  2.1   1:44.82 Xorg
 3240 krzysiek  20   0  2464 1056  776 R    4  0.1   0:00.02 top
    1 root      20   0  3420 1592 1120 S    0  0.1   0:01.01 init
    2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd
    3 root      RT  -5     0    0    0 S    0  0.0   0:00.00 migration/0
    4 root      15  -5     0    0    0 S    0  0.0   0:00.00 ksoftirqd/0
0

__krzysiek85 wielkie dzięki za pomoc.
Możesz mi powiedziać jakich opcji trzeba szukać przy programach aby działały z poziomu wywołania skruptu z poziomu javy bo np ps też nie zwraca żadnego wyniku ?

0

man ps

By default, ps selects all processes with the same effective user ID (euid=EUID) as the current user and associated with the same terminal as the invoker

Prawdopodobnie programy uruchamiane przez Javę nie mają przypisanego terminalu więc spróbuj:

ps ax
0

Dzięki za pomoc

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