Не удается запустить исполняемый файл с помощью ProcessBuilder в зависимости от компьютера - PullRequest
0 голосов
/ 04 июля 2018

Я столкнулся с проблемой при работе с Process и ProcessBuilder в Java.

У меня есть строка кода, похожая на эту:

Process process = new ProcessBuilder("des.exe", String... params);

Он отлично работает на моем персональном компьютере, но не на тестовом сервере, и я не могу понять, почему.

ErrorStream дает мне это:

des.exe: MZ����@���: not found 
des.exe: Syntax error: "(" unexpected

Оба компьютера работают на Ubuntu 16.04.4 LTS с java 1.8.

Есть идеи, откуда это может быть?

1 Ответ

0 голосов
/ 04 июля 2018

Наиболее вероятная причина различия заключается в том, что формат файла исполняемых файлов Windows не зарегистрирован в обработчике binfmt_misc в ядре, что позволяет ядру прозрачно выполнять различные программы через помощников. Ошибка Syntax error: "(" unexpected обычно означает, что файл был передан /bin/sh, а не вину.

Итак, проверьте, смонтирована ли файловая система binfmt_misc (большинство современных Linux делают это автоматически):

grep binfmt_misc /proc/self/mountinfo

должен возвращать некоторые записи (может быть autofs, может быть binfmt_misc зависит от дистрибутива).

если это не так, смонтировать его:

sudo mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc

Вы можете узнать, что зарегистрировано, посмотрев содержимое этого каталога. Чтобы зарегистрироваться для запуска DOS исполняемых файлов с вином, необходимо зарегистрировать его:

echo ':DOSWin:M::MZ::/usr/bin/wine:' | sudo tee /proc/sys/fs/binfmt_misc/register

После регистрации выполнение двоичного файла должно происходить прозрачно, и оно должно выполняться через ProcessBuilder.

Настройка этого для сервера во время загрузки оставлена ​​пользователю в качестве упражнения.

Если вы хотите пропустить весь этот беспорядок, вы можете изменить выполнение с des.exe на wine с первым аргументом des.exe.

...