2016-11-08 1 views
1

저는 리눅스에 있고 exec()를 사용하여 Java 응용 프로그램 (JAR 아카이브)을 가지고 있습니다. 어떤 명령이 응용 프로그램 exec()인지 알아야합니다. uting ... strace 및 jstack을 시도했지만 결과가 없습니다. 응용 프로그램이 exec ("ls")를 호출한다고 가정하면 위의 프로그램 출력을 grepping하여 ls 명령을 찾을 수 있습니까?JAVA exec()는 무엇입니까?

질문 : exec()로 실행되는 Java 응용 프로그램을 보는 간단한 방법이 있습니까? 더 나은 상황 개요

편집 :

자바 응용 프로그램에서 내가 그 기능 class.In 서로 정적 함수를 호출 온 클릭 리스너와 버튼이 있다고 가정이라는 exec("ls");입니다. 내가 그 내가 strace를에서 볼 버튼을 클릭하면 FROM : SCP를 시도

futex(0x7f14a6f799d0, FUTEX_WAIT, 4968, NULLDownload button clicked ! Trying SCP FROM... <unfinished ...>

을 .. 그 버튼 핸들러 내 SOUT 잘 exec()를 호출하기 전에이다.

다른 편집 : 고맙습니다.하지만 OS 관점에서 말하고 있습니다 ... 내가 sysadmin이고 JAR을 다운로드했다고 가정 해보십시오. 그 JAR의 무엇을하고 있는지 (외부에서) 알고 싶다 - 나는 그래서 strace을 시도했지만 어쩌면 너무 로깅 ... 간부에서 해당 명령을 호출에 대해 아무것도 보여주지 exec()

에서 시작 프로그램에만 관심이 있어요 많은 낮은 수준의 호출이 ...

그럼 내가 시도 jstack -m하지만 난 아무것도 exec에서 해당 명령을 찾고 찾을 수 없습니다. 나는 문자열을 그리면서 노력했지만 운이 없었습니다.

+0

'ls' 프로세스가 부모 프로세스로 Java 프로세스를 가져서는 안됩니다. ps의 출력을 볼 때 등? – Thomas

+0

@ 토마스 : 그러나 그 과정은 몇 밀리 초 동안 만 살아있을 것입니다. – Thilo

+0

흠, 멋진 생각 ...하지만 ls 명령이 실행되는 바로 그때에'ps '를 실행하는 경우에만 표시됩니다. 로그 나 트레이스 같은 것이 더 행복 할 것입니다 ... – Matka

답변

1

좋아, 내가 제안하려는 것은 veeeeeeeeeery 일을하는 기본적인 방법이지만, 당신이 찾고있는 것일 수 있습니다.

JAR은 Java .class 파일로 구성된 zip 파일 일뿐입니다. 어떤 명령이 실행될 지 알기 만하면, 실행하려고하는 클래스를 아는 경우 을 얻을 수 있습니다. 단지 gzip으로 jar 파일에서 클래스 파일을 추출한 다음 strings을 사용하면됩니다. 명령을 찾는다.

예를 들어, 여기에 내가 그 exec()를 사용하여 생각할 수있는 가장 간단한 클래스입니다 :

import java.io.IOException; 

public class Main { 
    public static void main(String[] args) { 
     try { 
      Runtime.getRuntime().exec("/bin/ls"); 
     } catch (IOException ignored) {} 
    } 
} 

당신이 strings Main.class을 할 경우이 같은 얻을 sould :

[...]$ strings Main.class 
<init> 
Code 
LineNumberTable 
LocalVariableTable 
this 
LMain; 
main 
([Ljava/lang/String;)V 
args 
[Ljava/lang/String; 
StackMapTable 
SourceFile 
     Main.java 
/bin/ls 
java/io/IOException 
Main 
java/lang/Object 
java/lang/Runtime 
getRuntime 
()Ljava/lang/Runtime; 
exec 
'(Ljava/lang/String;)Ljava/lang/Process; 

당신이 볼 수 있듯이을, /bin/ls은 문자열로 식별 할 수 있습니다. 이것은 Java 프로그램이 실행중인 명령을 모호하게하기 위해 런타임 중에 명령 문자열을 작성하기 위해 char 배열을 사용하는 것과 같이 이상한 방법으로 명령을 작성하지 않는 한 대부분의 경우에 작동해야합니다. 프로그램).

그러나 실시간으로 실행되는 명령을보고 싶다면 대부분의 명령이 너무 짧아서 top 및 그와 비슷한 것으로 표시되기 때문에 일부 모니터링 유틸리티를 사용해야 할 것 같습니다. .

편집 :에 대해서는 strace : 나는 Java's native C code for UNIX systems에보고했고 실제로 모든 명령 Runtime.exec()으로 시작 실행하기 위해 execvpe() 시스템 호출을 사용하는 것 같다

execvpe(argv[0], argv, envv); 

그래서 이론적으로, 당신은 할 수 있어야한다 strace -e execvpe <java command...>을 실행하여 실행 된 모든 명령을 나열하십시오 (execvpe()에 대한 다른 모든 호출과 마찬가지로 - 조금 더 필터링해야합니다.).

+0

흠, 고마워요. 이것은 흥미 롭습니다 ... 당신은 적어도 그 유틸리티의 이름을 알고 있습니까? 나는'strace'와'jstack -m'을 시도했습니다 ... – Matka

+2

저는 이것 좀 둘러 보았습니다 : http://superuser.com/questions/222912/how-can-i-log-all-process-launches- in-linux. 다른 방법으로, 지금 나는 큰 소리로 생각하고있다 : 사용자'new_user'를 생성하고,'ps -U new_user> output.txt'를 한 터미널의 루프에서 실행하는 스크립트를 작성하고 jar 파일을' new_user'를 다른 터미널에 설치하십시오. jar에 의한 모든 exec'exec()'d는'new_user'로 실행되어야합니다. 그래서 자바 프로그램이 끝나면'ps' 스크립트를 죽이고'output.txt' 파일을 검사하십시오. – walen

+0

안녕하세요 @ 마트 카! 제 대답이 당신에게 도움이된다면, 당신이 받아 들일 수있는 것으로 표시하는 것이 좋을 것입니다. 그러나 더 나은 방법을 찾은 경우 직접 문제를 게시하고 동일한 문제가있는 향후 사용자를위한 참조로이를 대신 받아 들여야합니다. – walen

관련 문제