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)"
Другие вопросы по тегам