Запуск bash-скрипта изнутри java, который продолжает работать после выхода из jvm - PullRequest
1 голос
/ 23 июля 2011

Я пытаюсь запустить bash-скрипт изнутри java, который будет жить после выхода из JVM. Моя текущая попытка выглядит примерно так:

String[] linCmd = {"/bin/bash", "-c", "\"set +m; shopt -u huponexit; nohup "
   + "myScript.sh 2>&1 > /dev/null &\""};
pb = new ProcessBuilder(linCmd);
//Other stuff to monitor and start pb

Но я не вижу, чтобы myScript.sh действительно запускался (в top или ps). Кстати, причина отдельной оболочки bash в том, что мне нужен set +m и я не хочу портить оригинал этим. Также nohup и shopt -u huponexit могут быть избыточными, но я пробовал это без каждого отдельно и, кажется, не могу заставить его работать правильно.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 23 июля 2011

Попробуйте, не добавляя лишних кавычек вокруг вашего "set + m ... &". Включая все это в третий элемент этого массива, вы говорите Java, что все это третий аргумент. Кавычки не нужны, и я думаю, что они могут помешать.

0 голосов
/ 23 июля 2011

Можете ли вы просто создать фоновый процесс, добавить вызов к disown этого фонового процесса и затем позволить оболочке завершиться?

disown [-ar] [-h] [jobspec ...]

Без опций каждая спецификация заданий удаляется из таблицы активных заданий.Если задана опция -h, каждая спецификация заданий не удаляется из таблицы, а помечается так, что SIGHUP не отправляется заданию, если оболочка получает SIGHUP.Если спецификация заданий отсутствует и не указана ни опция -a, ни опция -r, используется текущее задание.Если спецификация заданий не указана, опция -a означает удалить или отметить все задания;опция -r без аргумента jobspec ограничивает выполнение операций заданиями.Возвращаемое значение равно 0, если в задании не указано допустимое задание.

...