Я пытаюсь выполнить сценарий из кода моей Java, который выглядит как: < /p>
Process p = Runtime.getRuntime().exec(cmdarray, envp, dir); // cmdarray is a String array
// consisting details of the script and its arguments
final Thread err = new Thread(...); // Start reading error stream
err.start();
final Thread out = new Thread(...); // Start reading output stream
out.start();
p.waitFor();
// Close resources
< /code>
Выполнение скрипта закончилось (его пид больше нет), но Java застряла на Waitfor () < /code> Метод процесса!.
И да, я читаю выходные и потоки ошибок в 2 отдельных потоках. Да, они соединяются в конце (после waitfor () < /code>). < /P>
Скрипт в основном устанавливает несколько оборотов (примерно 10 или около того) и настраивается их. Таким образом, скрипт работает чуть более 60 секунд.#!/bin/sh
#exec 3>&1 >/var/log/some_log 2>&1
# If the above line is uncommented, Java recognizes that the
# process is over and terminates fine.
tar xzf a-package-having-rpms.tar.gz
cd unpacked-folder
(sh installer-script.sh) #This installs 10 odd rpms in a subshell and configures them
cd ..
rm -rf unpacked-folder
exit 0
< /code>
достаточно шокирующе, если я помесчу следующую строку в скрипт (вверху), Java понимает, что скрипт закончился, и он прекрасно завершает процесс. < /p>
exec 3>&1 > /var/log/some_log 2>&1
< /code>
Для записи скрипт не генерирует никаких выводов. Нулевые чары!. Таким образом, указатель EXEC не имеет смысла! < /P>
Но все же, волшебно, помещение оператора EXEC в скрипт заставляет Java работать!.
Почему ?? p>
Как я могу избежать этого нелогичного оператора EXEC в скрипте?. < /p>
Если вы заинтересованы в том, что установлен Script.sh выглядит тогда: < /p>
#!/bin/sh
exec 3>&1 >>/var/log/another-log.log 2>&1
INSDIR=$PWD
RPMSDIR=$INSDIR/RPMS
cd $RPMSDIR
#
rpm -i java-3.7.5-1.x86_64.rpm
rpm -i --force perl-3.7.5-1.x86_64.rpm
rpm -i --nodeps mysql-libs-5.0.51a-1.vs.i386.rpm
rpm -i --nodeps mysql-5.0.51a-1.vs.i386.rpm
rpm -i --nodeps mysql-server-5.0.51a-1.vs.i386.rpm
rpm -i --nodeps perl-DBD-MySQL-3.0007-2.el5.i386.rpm
rpm -i --nodeps perl-XML-Parser-2.34-6.1.2.2.1.i386.rpm
.
.
.
< /code>
Теперь, почему команда Exec в первом скрипте требуется для Java, чтобы узнать, что процесс окончен?
Как я могу избежать этого Exec?, Esp. Поскольку первый скрипт не дает никаких выводов.>
Подробнее здесь: https://stackoverflow.com/questions/347 ... -completed