Runtime.exec () из tomcat6 успешно, но не может получить доступ ни к каким файлам - PullRequest
0 голосов
/ 02 марта 2011

Я перемещаю наши сервлеты (на чистом Java, работающем в Tomcat 6) из CentOS в Debian и столкнулся с проблемой при выполнении команд с Runtime.exec().
(Командой ImageMagick должна быть convert в работе, но я упростила вызовы, чтобы найти источник проблем, поэтому весь следующий код с echo протестирован и не работает).

String command = "echo test123 > /tmp/tomcat6-tmp/1";
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command);
int exitVal = process.waitFor();

Кажется довольно распространенным способом вызова внешней программы. Он запускается, возвращает 0 в exitVal, но не может создать файл и поместить в него текст.
Так же как и низкоуровневый подход:

ProcessBuilder pb = new ProcessBuilder("echo", "test123 > /tmp/tomcat6-tmp/3");
Process process = pb.start();
int resInt = process.waitFor();

Но можно создать файл и поместить в него некоторый текст, используя Java-код, помещенный в тот же метод:

String fname = "/tmp/tomcat6-tmp/2";
File file = new File(fname);
file.createNewFile();
FileWriter fileWriter = new FileWriter(file);
fileWriter.write("test123");
fileWriter.close();

Runtime.exec("whoami") успешно возвращает tomcat6, папка /tmp/tomcat6-tmp/ существует, все разрешения установлены правильно.

$ ls -al /tmp/tomcat6-tmp/
total 60
drwxr-xr-x 2 tomcat6 root     4096 Mar  2 15:26 .
drwxrwxrwt 6 root    root     4096 Mar  2 15:25 ..
-rw-r--r-- 1 tomcat6 tomcat6     7 Mar  2 15:26 2

Кажется, что все команды без необходимости доступа к файлам в системе обычно выполняются с Runtime.exec() в том же контексте.

Я использую свежую установку Debian Squeeze с установленным tomcat6 из пакетов, без каких-либо изменений в конфигурации:

$ aptitude show tomcat6
Package: tomcat6                         
State: installed
Version: 6.0.28-9+squeeze1
.....
$ cat /etc/issue
Debian GNU/Linux 6.0 \n \l

Как я могу решить проблему? Или хотя бы куда мне смотреть? Я погуглил все мыслимые причины неправильного поведения Java, но не смог найти подсказки.

P.S. Поскольку это установка по умолчанию, диспетчер безопасности Java отключен в /etc/init.d/tomcat6

# Use the Java security manager? (yes/no)
TOMCAT6_SECURITY=no

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

Поместите нужное действие в один исполняемый скрипт оболочки, затем exec скрипт оболочки.

Java Runtime.exec() - это оболочка для системного вызова exec, которая будет запускать процесс напрямую, а не под вложенной оболочкой. Перенаправление > выполняется оболочкой и не будет работать в качестве аргумента непосредственно exec ed процесса.

1 голос
/ 02 марта 2011

Не знаю, можно ли запустить этот «echo test123> / tmp / tomcat6-tmp / 1» одной командой. Я помню, что у меня была похожая проблема, и мне пришлось ее разделить, поэтому попробуйте запустить «echo test123», а затем получить поток ввода с выводом команды. Если у вас есть поток, вы можете легко записать в файл.

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

...