2016-11-08 10 views
1

Я нахожусь в Linux, и у меня есть приложение Java (архив JAR), в котором используется exec(), чтобы сделать это. Мне нужно выяснить, какие команды это приложение exec() ut ... Я пробовал strace и jstack, но без каких-либо результатов. Предположим, что приложение вызывает exec («ls»), могу ли я найти команду ls только путем вывода grepping из вышеперечисленных программ?Что такое JAVA exec() uting?

Вопрос в следующем: Есть ли простой способ посмотреть, что работает Java-приложение с exec()?

Edit для лучшего обзора ситуации:

Предположим, что в Java приложения У меня есть кнопка с OnClick слушателя, который вызывает статическую функцию из другого class.In этой функции exec("ls"); называется. При нажатии на эту кнопку, я вижу это в Трассирование:

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

Trying SCP ОТ .. только мое Sout в этой кнопки обработчик прямо перед вызовом exec().

Другое редактирование: Спасибо, ребята, но я говорю с точки зрения OS ... Предположим, что я сисадмин, и я скачал JAR. Я хочу знать (из-за границы), что делает JAR - меня интересуют только программы, начинающиеся с exec()

Итак, я попробовал strace, но ничего не говорит о вызове этой команды из exec ... Может быть, это тоже запись очень низкий уровень вызывает это ...

Тогда я попробовал jstack -m, но я не могу найти ничего подобного этой команды от exec. Я пробовал строку grepping, но не повезло.

+0

Не должен ли процесс 'ls' обрабатывать Java как его родительский элемент, например. при просмотре вывода 'ps' и т. д.? – Thomas

+0

@Thomas: Но этот процесс будет жив только на несколько миллисекунд. – Thilo

+0

Хм, хорошая идея ... Но это будет показано только в том случае, если я запустил 'ps' как раз вовремя, когда выполняется команда ls. Я был бы более счастлив с чем-то вроде журнала или следа ... – Matka

ответ

1

ОК, то, что я собираюсь предложить, представляет собой простой способ делать вещи, но это может быть то, что вы ищете.

Как вы, наверное, знаете, JAR - это всего лишь zip-файл, содержащий файлы Java .class. Если вам просто нужно заглянуть, какие команды будут исполняться, и, если вы знаете класс, который должен их выполнять, вы можете просто извлечь файлы классов из банки с помощью gzip, а затем использовать 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 не создает команды странным образом, например, используя массив символов для создания командных строк во время выполнения, чтобы затушить исполняемые команды (в этом случае я был бы очень подозрительным к такому программа).

Однако, если вы хотите видеть команды, выполняемые в режиме реального времени, я боюсь, вам придётся прибегнуть к какой-либо утилите мониторинга, так как большинство команд будут слишком короткими, чтобы даже появиться на top и т. П. ,

EDIT: Что касается strace: Я посмотрел на Java's native C code for UNIX systems и кажется, что он на самом деле использует execvpe() системный вызов для запуска все команды начали с Runtime.exec():

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- в-Linux. В качестве альтернативы, и теперь я просто задумываюсь вслух: вы можете создать пользователя 'new_user', написать сценарий, который запускает' ps -U new_user> output.txt' в цикле в одном терминале, и запускать банку как ' new_user' в другом терминале. Каждая команда 'exec()' d в jar должна запускаться как 'new_user', поэтому, когда программа Java заканчивается, просто запустите скрипт' ps' и проверьте файл 'output.txt'. – walen

+0

Привет @ Матка! Напомним, что если бы мой ответ был вам полезен, было бы хорошо, если бы вы отметили его как принятое. Однако, если вы нашли лучший способ, вы должны опубликовать ответ самостоятельно и принять это вместо этого в качестве ссылки для будущих пользователей с той же проблемой. – walen