【问题标题】:Java does not execute all commands in shellscript with Apache commons execJava 不使用 Apache commons exec 执行 shellscript 中的所有命令
【发布时间】:2017-02-05 14:43:39
【问题描述】:

我在这里遇到了这种奇怪的行为。

我有以下方法:

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 可以执行脚本的“某些部分”,我还假设该方法也很好。所以我完全迷失了。有什么提示吗?

======== 更新 =========

问题解决了,以后的读者可以参考下面的cmets。

【问题讨论】:

  • 您是否从同一用户执行它(java 程序和直接 ksh 脚本)?如果未提供 -u 选项,则 crontab 对当前用户条目进行操作
  • 这可能是一个很好的提示。关于-u,我不能使用它,因为:“必须有特权才能使用-u”。我无法以超级用户身份执行它。但是应该有一种方法可以强制 java 与某个用户一起执行,不是吗?
  • 将 whoami > /tmp/java_whoami.txt 添加到您的 ksh 并检查文件 /tmp/java_whoami.txt 是否是您所期望的用户
  • Perfect Piotr R。我这样做并意识到我的应用程序实际上是以 root 身份运行的,所以我只是添加了 -u 参数。如此简单,但我无法想到这一点。非常感谢。

标签: java shell ksh apache-commons-exec


【解决方案1】:

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

解决办法是用-u参数指向实际用户:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多