Java не выполняет все команды в шеллскрипте с помощью Apache Commons Exec
У меня здесь такое странное поведение.
У меня есть следующий метод:
public static void loadMonitorsFromCron(){
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
File ism_dir = new File("/var/app/ism/");
String line = "/usr/bin/ksh /var/app/ism/ism_check_cron.ksh";
CommandLine commandLine = CommandLine.parse(line);
try {
DefaultExecutor exec = new DefaultExecutor();
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
exec.setWorkingDirectory(ism_dir);
exec.setStreamHandler(streamHandler);
exec.execute(commandLine);
} catch (ExecuteException e1) {
System.out.println("ERROR: "+e1.getMessage());
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
System.out.println("ERROR: "+e1.getMessage());
// TODO Auto-generated catch block
e1.printStackTrace();
}
String[] paths = outputStream.toString().split("\n");
System.out.println("Paths: ");
for(int i=0;i<paths.length;i++)
System.out.println(paths[i]);
loadErrorCodeFromPath(paths);
}
И это сценарий: ism_check_cron.ksh Я пытаюсь выполнить:
#!/usr/bin/ksh
echo "inbound_monitor.ksh"
echo "$(crontab -l | grep ism | grep -v '#' | cut -d ' ' -f 6 | cut -d '/' -f 5)"
echo "ism_heapdump.ksh"
Когда я смотрю вывод из systemOut, я просто вижу это:
SystemOut O Paths:
SystemOut O inbound_monitor.ksh
SystemOut O
SystemOut O ism_heapdump.ksh
Crontab -l был предложен для перечисления многих других строк, подобных приведенным выше, но, как вы можете видеть, я ничего не получил через Java.
Если я выполняю скрипт в терминале Linux, он работает нормально. Поскольку Java может выполнять "некоторую часть" сценария, я также предполагаю, что метод тоже подойдет. Так что я полностью потерялся. Любой намек?
======== ОБНОВЛЕНИЕ =========
Проблема решена, будущие читатели могут обратиться к комментариям ниже.
2 ответа
Выполнение crontab -l без опции -u перечислит только записи текущего пользователя crontab.
Решение состоит в том, чтобы указать фактическому пользователю параметр -u:
echo "$(crontab -u myuser -l | grep ism | grep -v '#' | cut -d ' ' -f 6 | cut -d '/' -f 5)"
Второе решение состоит в том, чтобы добавить все записи крана для пользователя, который запускает вашу Java-программу, и удалить записи от пользователя, который в них не нуждается.
Java работала с пользователем, которого я не ожидал. Следуя совету @Piotr R, я решил эту проблему, добавив параметр -u в команду crontab -l:
echo "$(crontab -u myuser -l | grep ism | grep -v '#' | cut -d ' ' -f 6 | cut -d '/' -f 5)"