쉘스크립트로 실행한걸 echo 로 뽑아내고 싶은데 어떻게 해야하나요?

웹상에 보니 top -n 1 | grep -i cpu(s)| awk ‘{print $5}’ | tr -d "%id," | awk ‘{print 100-$1}’ 이런 명령어로 CPU 사용률 뽑아 낼수 있다고해서 쉘 스크립트로 해서 echo로 빼내려고 하는데.
CPU_usage= 이렇게 해서 echo $CPU_usage 로 뽑아내고 싶은데… 혹시 어떻게 하시는지

자문 자답입니다.

CPU=$(실행할명령)

이렇게 뽑아 내시면 됩니다 ㅋㅋㅋ

궁금한게 있는데
제가 지금 자바로 쉘스크립트를 실행해서

그 쉘스크립트에 있는 정보를 골라서 출력해보고 싶습니다.

님 질문이랑 비슷한거 같은데 어케하셨는지 여쭤봐도 될까요?

제가 본문의 작성자는 아닙니다만… 다음과 같지 않을까요?

[code:1uyjf32k]
#!/usr/bin/bash
VARIABLE=$(ls ~/)

echo $VARIABLE
[/code:1uyjf32k]

위 내용을 what_is_in_my_home.bash 라는 파일에 작성하시고

$ bash ./what_is_in_my_home.bash 라고 실행하시면

홈 디렉토리에서 ls 한 것과 동일한 결과가 출력될겁니다.

즉, ls ~/ 의 결과가 VARIABLE 라는 환경 변수에 기록되는것이고
echo 를 통해서 저장된 환경 변수의 을 출력하게 한 거죠.

근데… 실제로 안해보고 적은거라… 안될지도 몰라요…엄;;;

JS 에서 환경변수에 접근할수 있는지 모르겠지만, 만약 환경변수에 접근이 어렵다면
shell script에서 파일로 출력하고, JS 에서 파일내용을 읽어들이면 되지 않을까요?-//-;;

[quote="yonoo88":2to512y4]궁금한게 있는데
제가 지금 자바로 쉘스크립트를 실행해서

그 쉘스크립트에 있는 정보를 골라서 출력해보고 싶습니다.

님 질문이랑 비슷한거 같은데 어케하셨는지 여쭤봐도 될까요?[/quote:2to512y4]

자바로 프로그램을 실행하시려면 Runtime객체를 사용하시면 됩니다.
샘플을 작성해 보았습니다.

[code:2to512y4]
import java.io.*;

class Runner {
public static void main (String[] args) throws Exception {
Runtime rt = Runtime.getRuntime();
String[] cmds= { "/bin/bash", "myscript.sh" };
Process p = rt.exec(cmds);
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
PrintWriter w = new PrintWriter(new OutputStreamWriter(p.getOutputStream()));
String line;
while(true) {
line = r.readLine();
if (line == null) break;
System.out.println(line);
}
}
}
[/code:2to512y4]
여기서 line변수의 값을 가지고 파싱하시면 되겠죠.
쉘스크립트에 무언가 입력해야 한다면 w로 출력하면 그것이 쉘스크립트의 표준입력으로 들어가고,
쉘스크립트에서 결과를 읽을 때에는 r에서 읽으면 됩니다.
머 기본적인 문자열 파싱은 String객체의 indexOf와 substring 메소드를 사용하게 됩니다만,
역시 파싱이란것은 복잡한 관계로 그렇게 하지 말고, 쉘스크립트내에서
awk나 sed등으로 출력형식을 정규화 하신 후,
자바에서는 간단한 구분자를 통해 구분하는 방식이 편합니다.
String객체의 split메소드로 가볍게 분리하게끔 말이지요.

보다 범용적으로 하시려면 스크립트에서 xml이나 csv형식으로 출력하고,
자바에서는 xml이나 csv형식을 파싱하는 방법도 있겠습니다.
또는, sqlite db파일을 생성후,
스크립트에서 sqlite db에 결과를 insert하고,
자바에서 jdbc로 sqlite db에 접속하여, sql문으로 쿼리하는 방법도 있겠습니다.

[quote="protochaos":15i7v4gk][quote="yonoo88":15i7v4gk]궁금한게 있는데
제가 지금 자바로 쉘스크립트를 실행해서

그 쉘스크립트에 있는 정보를 골라서 출력해보고 싶습니다.

님 질문이랑 비슷한거 같은데 어케하셨는지 여쭤봐도 될까요?[/quote:15i7v4gk]

자바로 프로그램을 실행하시려면 Runtime객체를 사용하시면 됩니다.
샘플을 작성해 보았습니다.

[code:15i7v4gk]
import java.io.*;

class Runner {
public static void main (String[] args) throws Exception {
Runtime rt = Runtime.getRuntime();
String[] cmds= { "/bin/bash", "myscript.sh" };
Process p = rt.exec(cmds);
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
PrintWriter w = new PrintWriter(new OutputStreamWriter(p.getOutputStream()));
String line;
while(true) {
line = r.readLine();
if (line == null) break;
System.out.println(line);
}
}
}
[/code:15i7v4gk]
여기서 line변수의 값을 가지고 파싱하시면 되겠죠.
쉘스크립트에 무언가 입력해야 한다면 w로 출력하면 그것이 쉘스크립트의 표준입력으로 들어가고,
쉘스크립트에서 결과를 읽을 때에는 r에서 읽으면 됩니다.
머 기본적인 문자열 파싱은 String객체의 indexOf와 substring 메소드를 사용하게 됩니다만,
역시 파싱이란것은 복잡한 관계로 그렇게 하지 말고, 쉘스크립트내에서
awk나 sed등으로 출력형식을 정규화 하신 후,
자바에서는 간단한 구분자를 통해 구분하는 방식이 편합니다.
String객체의 split메소드로 가볍게 분리하게끔 말이지요.

보다 범용적으로 하시려면 스크립트에서 xml이나 csv형식으로 출력하고,
자바에서는 xml이나 csv형식을 파싱하는 방법도 있겠습니다.
또는, sqlite db파일을 생성후,
스크립트에서 sqlite db에 결과를 insert하고,
자바에서 jdbc로 sqlite db에 접속하여, sql문으로 쿼리하는 방법도 있겠습니다.[/quote:15i7v4gk]

지금 스크립트 파일 실행소스밖에 없는데
실행구문을 입력하려면 어떻게 해야되나요?
위 예제에서 { "/bin/bash", "myscript.sh" }; 이거는 실행과 파일경로인데
grep "myname" ./myscript.sh 이런 동작구문을 실행시켜보려고 합니다. 자바에서는 어떻게 해야 실행이 되나요?

{ "/bin/bash", "myscript.sh" };
요 부분을
{"/bin/grep", "myname ", "./myscript.sh"};
이렇게 하시면 ./myscript.sh의 내용중의 myname이라는 문자열을 검색하여 출력할 것입니다.
리눅스내에서 /bin/grep myname ./myscript.sh이라고 명령한 것과 같다고 보시면 됩니다.

만일 myscript.sh을 실행하여 myname이라는 문자열을 검색하고자 하신다면…
{"/bin/bash", "-c" "./myscript.sh|/bin/grep myname"};
이렇게 하셔야 할것입니다.
그런데 myscript.sh의 실행속성이 없다면…
{"/bin/bash", "-c" "/bin/bash ./myscript.sh|/bin/grep myname"};

이것은 /bin/bash -c "./myscript.sh|/bin/grep myname" 과 같은 것으로
./myscript.sh | /bin/grep myname와 동일하다고 보시면 됩니다.

쪽지를 지금 확인하였네요 …

위에 글을 다 읽어보지 못하였는데,

protochaos 님 코드처럼… 하시면 사용하실수 있습니다.

불론 쉘스크립트에서 뽑아내실대는 echo 안에 넣으셔서 해야합니다.

저도 정확하게는 잘모르지만 echo 로 안뽑아내고 그냥 나온 결과값으로 하면 안 뽑아지더라고요 ^^

[quote="eizt":pms8e0x6]
불론 쉘스크립트에서 뽑아내실대는 echo 안에 넣으셔서 해야합니다.

저도 정확하게는 잘모르지만 echo 로 안뽑아내고 그냥 나온 결과값으로 하면 안 뽑아지더라고요 ^^[/quote:pms8e0x6]

정확히 무엇을 말씀하시는건지 잘 모르겠네요.

예를 들어
a.sh의 내용이
A=ls /
이고,

sh a.sh
echo $A

이렇게 하신 다면 이것은 문제가 있습니다.
왜냐면 A라는 환경변수는 a.sh을 실행하는 bash/sh등의 해당 프로세스(작업단위)에서만
유효하기 때문에… sh a.sh 이 작업이 종료된 시점이나 다른 프로세스(자식프로세스포함)에서는 유효하지 않기 때문에…
echo $A는 제대로 출력되지 않습니다.
이럴경우 유효하게 하기 위해서는
sh a.sh대신…
. a.sh 혹은 source a.sh로 실행하셔서, 자식프로세스에서 a.sh을 실행하는 것이 아니라,
현재프로세스(현재의쉘 혹은 로그인쉘)에서 실행하게 하여야 합니다.

[quote="protochaos":1rpzlsdz]{ "/bin/bash", "myscript.sh" };
요 부분을
{"/bin/grep", "myname ", "./myscript.sh"};
이렇게 하시면 ./myscript.sh의 내용중의 myname이라는 문자열을 검색하여 출력할 것입니다.
리눅스내에서 /bin/grep myname ./myscript.sh이라고 명령한 것과 같다고 보시면 됩니다.

만일 myscript.sh을 실행하여 myname이라는 문자열을 검색하고자 하신다면…
{"/bin/bash", "-c" "./myscript.sh|/bin/grep myname"};
이렇게 하셔야 할것입니다.
그런데 myscript.sh의 실행속성이 없다면…
{"/bin/bash", "-c" "/bin/bash ./myscript.sh|/bin/grep myname"};

이것은 /bin/bash -c "./myscript.sh|/bin/grep myname" 과 같은 것으로
./myscript.sh | /bin/grep myname와 동일하다고 보시면 됩니다.[/quote:1rpzlsdz]

한가지 더 궁금한게 있는데 이건 로컬호스트에서 쉘을 실행할 때 쓰이지만
원격지의 쉘스크립트를 수행하고자 한다면 원격지의 주소만 추가 해주면 될까요? 아님 Runtime 같은 다른 자바 구문이 있는건가요?

[quote="yonoo88":316l6uns]
한가지 더 궁금한게 있는데 이건 로컬호스트에서 쉘을 실행할 때 쓰이지만
원격지의 쉘스크립트를 수행하고자 한다면 원격지의 주소만 추가 해주면 될까요? 아님 Runtime 같은 다른 자바 구문이 있는건가요?[/quote:316l6uns]

Runtime은 자바가상머신이 실행하는 것인데, 원격지 같은 경우는 따로 네트웍 통신이 필요하니 그런것은 존재하지 않습니다.
공개용 SSH 라이브러리를 이용해서 실행하는 방법이나 CORBA등을 사용할 수 있지만…
가장 손쉬운 방법은 웹서버를 통하여 CGI나 Servlet, PHP등으로 서버에서 쉘스크립트를 실행될 수 있게 만들고,
자바에서는 웹통신으로 결과를 받는게 쉽죠.
그렇지만 이럴때 보안이 문제가 되기 때문에… 인증등을 처리해줄 필요가 있습니다.