Runtime.exec () не может запустить "su - postgres -c 'pg_dump ...'" - PullRequest
4 голосов
/ 30 декабря 2010

Это команда, которую я хочу выполнить:

su - postgres -c "pg_dump ....."

для резервного копирования базы данных postgres.

Если я сейчас нахожусь в linux shell, как root, он отлично работает.

Но теперь я хочу запустить его из Java-приложения, как:

String cmd = "su - postgres -c \"pg_dump --port 5432 .....\""
Process p = Runtime.getRuntime().exec(cmd);
// read the error stream and input stream
p.waitFor();

Выдает ошибку:

su: unknown option "--port"
please try "su --help" to get more information

Теперь я изменяю код как:

Process p = Runtime.getRuntime().exec(new String[0]{cmd});
// read the error stream and input stream
p.waitFor();

Cannot run program "su - postgres -c \"pg_dump .....\"": java.io.IOException: error=2, no that file or directory

Что мне теперь делать?

Ответы [ 2 ]

3 голосов
/ 30 декабря 2010

Помимо ответов, приведенных выше (и это хорошо для понимания вашей проблемы), помните, что вы всегда можете сделать свою жизнь проще, просто поместив свою команду в файл сценария оболочки.Например, файл dumppg.sh, который содержит две строки:

#!/bin/sh
su - postgres -c "pg_dump ....."

просто делает его исполняемым и (после тестирования) вызывает его из java.

3 голосов
/ 30 декабря 2010
exec(new String[]{"sh", "-c", "su - postgres ..."});
...