Java不会使用Apache commons exec在shellscript中执行所有命令

时间:2016-09-27 20:19:43

标签: java shell ksh 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 个答案:

答案 0 :(得分:2)

在没有 -u 选项的情况下执行 crontab -l <​​/ em>将仅列出当前用户的crontab条目。

解决方案是使用 -u 参数指向实际用户:

echo "$(crontab -u myuser -l | grep ism | grep -v '#' | cut -d ' ' -f 6 | cut -d '/' -f 5)"

第二个解决方案是为运行java程序的用户添加所有crantab条目,并从不需要它们的用户中删除条目。

答案 1 :(得分:0)

Java正在运行我没想到的用户。在@Piotr R建议之后,我通过在crontab -l命令中添加-u参数解决了这个问题:

double get_data = 0;
for (std::string line; (std::getline(file,line));)
  {
  std::istringstream row(line);
  Data data;
  row >> data.w >> data.x >> data.y >> data.z;

    std::vector<double> wcol;
    std::vector<double> xcol;
    std::vector<double> ycol;
    std::vector<double> zcol;

get_data++;

for (int j = 0; j < get_data - 1; j++) {

  if(data.w > 0)
{

      wcol.push_back(data.w);
      xcol.push_back(data.x);
      ycol.push_back(data.y);
      zcol.push_back(data.z);

     }
get_data = 0;
}