Solaris - Почему зависает java.lang.UNIXProcess.forkAndExec (собственный метод)

2

У меня есть приложение Java, работающее на Solaris. Это приложение регулярно запускает внешние процессы с использованием Runtime.exec. Похоже, что через некоторое время, успешно запустив такие процессы, начнется запуск процесса. Сброс потока, сделанный в этот момент (и несколько минут спустя), показывает, что java.lang.UNIXProcess.forkAndExec "застрял". Ниже приведена верхняя часть соответствующей трассировки стека, взятой из дампа потока:

"Thread-85305" prio=3 tid=0x0000000102aae800 nid=0x21499 runnable [0x7fffffff2a3fe000]
   java.lang.Thread.State: RUNNABLE
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)

Я прочитал некоторые форумы, где другие испытали forAndExec, бросая IOException из-за нехватки места или недостаточно памяти, но я не получаю эту ошибку здесь. Я сейчас жду, чтобы получить результаты pstack в надежде, что он откроет больше информации.

Кто-нибудь знает, как решить эту проблему? благодаря, Mike

  • 0
    что происходит в вашем приложении? Вы ожидаете, что процесс завершится к тому времени, когда вы взяли дамп потока? Вы видите странное поведение памяти?
  • 0
    Внешнее приложение представляет собой процесс Perl. Это, конечно, должно было закончиться к тому времени, когда я взял дамп потока. Что еще более важно, мы видим два экземпляра JVM, которые, как я понимаю, являются стандартным поведением в Solaris при запуске внешних процессов и которые соответствуют разветвлению. Тогда кажется, что разветвление имело место, а exec-часть forkAndExec - нет. Согласно ошибкам, перечисленным ниже:
Показать ещё 1 комментарий
Теги:
native
solaris

3 ответа

0

Установка патч-панели Sun Alert Patch сделает трюк.

  • 0
    Вы можете принять свои собственные ответы, Майк, спасибо за сообщение (по истечении этого времени).
0

Является ли stdout и stderr из процесса потребления? Вы можете посмотреть результаты полного буфера.

Вы можете проверить это, добавив перенаправление вывода в файл temp для команды, которая была создана.

  • 2
    Да, stdout и stderr потребляются. Вероятно, что внешний скрипт даже не начал работать. Мы видим два экземпляра Java-приложения primay, что означает, что разветвление имело место, а exec-часть forkAndExec - нет.
  • 0
    Возможно, большие процессы развиваются медленнее ...
0

Пока поток работает до тех пор, пока выполняется ваш исполняемый файл, возможно, это только ваш внешний исполняемый файл, который висит.

Вам следует попытаться найти параметры, переданные вашему исполняемому файлу, и попытаться запустить его вручную.

  • 0
    Но, насколько мне известно, Runtime.exec () является асинхронным по отношению к внешнему процессу. Другими словами, обычно после того, как Runtime.exec () возвращается, межпроцессное взаимодействие будет успешно выполняться с запущенным внешним процессом.
  • 0
    Обратите внимание, что внешний процесс - это Perl. Когда возникает проблема, мы видим два идентичных pid для приложения, т.е. исполняемая часть forkAndExec не состоялась, я верю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню