Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Perl & System() & Java


Автор: DOKA 14.8.2007, 14:20
Добрый день!

Столкнулся с непонятной проблемой.

print system("ls") - работает
print system("ls -la") - работает
print system("java") - работает
print system("java -v") - не работает - ошибка 256
print system("java -jar /var/www/reg/myJar.jar") - не работает - ошибка 512

А мне как раз нужны именно последняя команда. По сути необходимо запустить jar (с некоторыми параметрами) лежащий в той же дире, что и скрипт и выдать в виде странички.

Что за ошибки 256 и 512 perldoc -f system умалчивает :(

Может у кого-нибудь есть идеи?

Автор: dimes 14.8.2007, 15:27
perror 256
perror 512

что выдают?
Вообще то странные коды...

Цитата(DOKA @  14.8.2007,  15:20 Найти цитируемый пост)

print system("java -v") - не работает - ошибка 256
print system("java -jar /var/www/reg/myJar.jar") - не работает - ошибка 512

а если напрямую в шеле выполнить, выполняется без ошибки?



Автор: DOKA 14.8.2007, 15:40
Цитата(dimes @ 14.8.2007,  15:27)
1)
perror 256
perror 512

что выдают?
Вообще то странные коды...



2)
а если напрямую в шеле выполнить, выполняется без ошибки?

1) Что за perror? Perldoc молчит, в шелле такой команды тоже нету...
2) Да, естественно, в шелле всё вышенаписаное выполняется отлично.

Автор: Nab 14.8.2007, 15:47
попробуйте так:

Код

print system("java", "-jar", "/var/www/reg/myJar.jar");


хотя если нужен результат то возможно так лучше будет

Код

print `java -jar /var/www/reg/myJar.jar`;


Автор: arto 14.8.2007, 19:35
java в $PATH ?

Автор: DOKA 14.8.2007, 23:36
Цитата(Nab @ 14.8.2007,  15:47)
попробуйте так:

Код

print system("java", "-jar", "/var/www/reg/myJar.jar");


хотя если нужен результат то возможно так лучше будет

Код

print `java -jar /var/www/reg/myJar.jar`;

Обы варианта не работают. :(

Добавлено @ 23:38
Цитата(arto @ 14.8.2007,  19:35)
java в $PATH ?

Да.
Код

doka:/home/doka# env | grep PATH; whereis java
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11
java: /usr/bin/java /etc/java /usr/lib/java /usr/X11R6/bin/java /usr/bin/X11/java /usr/share/java /usr/share/man/man1/java.1.gz

К тому же просто system('java') отрабатывает.

Автор: Nab 14.8.2007, 23:44
ой, этож под линуксом я подозреваю, тогда может вот так

print system('java', '-jar', '/var/www/reg/myJar.jar');

Автор: Rigel 15.8.2007, 11:29
Цитата(DOKA @ 14.8.2007,  23:36)
Код

print `java -jar /var/www/reg/myJar.jar`;

Обы варианта не работают. :(
[/QUOTE]
Конечно не работают.  smile 
$respp = `java -jar /var/www/reg/myJar.jar`;
Это должно работать. У меня, во всяком случае, с параметрами так работет. И не надейтесь на пути по-умолчанию, вызывайте все с полным путем.

Автор: amg 15.8.2007, 16:16
Rigel, даже любопытно стало, как 
Код

print `java -jar /var/www/reg/myJar.jar`;
и 
Код

$respp = `java -jar /var/www/reg/myJar.jar`;
print $respp;
могут дать различный результат при печати? (Если, конечно, не трогать $\ и т.п.).

Автор: dimes 15.8.2007, 16:43
если `` вернет массив то различия будут

Добавлено через 6 минут и 35 секунд
вот только на работоспособность это никак не влияет

DOKA, 
если вариант Nab не сработает, можно приступать к пляскам с бубном.
Впрочем можно по пребывать поиграться с путями (надеюсь ты скрипт в шеле дергаешь?)
Я не знаю как работает команда "java -jar /var/www/reg/myJar.jar" нужно ли там общаться в процессе установки?

Автор: Rigel 15.8.2007, 19:04
Цитата(dimes @ 15.8.2007,  16:43)
Добавлено @ 16:50
вот только на работоспособность это никак не влияет

Абсолютные пути пропишите

Автор: amg 16.8.2007, 08:05
Цитата(dimes @  15.8.2007,  16:43 Найти цитируемый пост)
если `` вернет массив то различия будут

dimes, я же специально оговорился: если не трогать $\ и т.п. (еще $, может влиять на результат). С этой оговоркой не представляю себе, какие могли бы быть различия.

По теме. Непонятно, почему так происходит. Я с подобным ни разу не сталкивался. Вызов с консоли и через system с несколькими аргументами всегда отрабатывали идентично. Что возвращает system? 

Rigel, правильно советует, лучше прописать на всякий случай абсолютный путь, причем на сам исполняемый файл (возможно, /usr/bin/java - это симлинк, на /usr/lib/java/bin/java например). И лучше пользоваться вызовом system с несколькими аргументами, как Nab советовал: тогда шелл не будет участвовать в вызове команды и всяких косяков меньше. 

Автор: dimes 16.8.2007, 08:41
Цитата(amg @  16.8.2007,  09:05 Найти цитируемый пост)
dimes, я же специально оговорился: если не трогать $\ и т.п.


Код

my @_arr=(1,2,3,4,5);
print @_arr,"\n";
my $_v=@_arr;
print $_v;

Автор: DOKA 17.8.2007, 14:17
Пробовал указывать реальный путь к java - /usr/lib/jvm/java-1.5.0-sun... - ошибка 512
Пробовал делать my $out = system $cmd; print $out; - ошибка 512
Пробовал передавать в system массив - ошибка 512
:(

В принципе проблему частично решил модифицировав .jar в .war (сервлет) и запустив его под Apache Tomcat, но странно почему perl не может нормально вызывать jar'.

Автор: tishaishii 22.8.2007, 16:38
Ему до расширения и самого файла дела нету. И до командной строки тоже ему дела нету.
Ты думаешь, что perl парсит команду в кавычках и потом её сам выполняет. Тогда вместе с Perl ещё и java и ls должны поставляться. И вообще отдельная PerlOS и железо.smile)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)