Я перемещаю наши сервлеты (на чистом 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