在tomcat7上运行shell脚本

时间:2015-06-03 15:01:16

标签: java linux shell tomcat permissions

我试图修复tomcat7服务器的文件权限已经两天了。我有一个库类(myapp / WEB-INF中包含的.jar文件)需要运行shell脚本。该库是由我编写的,在NetBeans中工作正常。在创建,阅读和删除文件时没有麻烦。这是因为NetBeans以blumonkey(我的Ubuntu系统上的用户名)运行程序。但是当我将它导入tomcat并运行它时,tomcat"执行"该命令不产生明确的输出,尝试检查文件(将在脚本成功时生成)并抛出FileNotFoundException。

更多详情如下:

  • 使用apt-get安装Tomcat7,其数据位于2个位置 - / var / lib / tomcat7包含conf和webapps文件夹,/ usr / share / tomcat7包含bin和lib文件夹
  • 用户上传.zip文件,该文件存储在/ home / blumonkey / data中。其余程序在此处存储的文档上运行。 tomcat上传的所有新文件夹/文件显然都是tomcat7作为所有者。
  • 我尝试过将所有权更改为blumonkey,将tomcat7添加到blumonkey用户组,但没有一种方法可行(在这附近我可能搞砸了不小心更改权限:/)。显然tomcat7无法处理它拥有的文件。(这怎么可能?)。
  • 当我在终端中运行脚本时,脚本可以正常工作。但是当我执行sudo -u tomcat7 script.sh时,它不起作用,即将其作为tomcat7运行。它只是退出而没有消息。我怀疑这是发生了什么,因为我试图通过重定向ProcessBuilder中的错误和输出进行调试,但它们是空的。

有关如何解决问题并使脚本运行的任何帮助将不胜感激。如果您需要更多信息,请发表评论。

脚本执行代码

     private static void RunShellCommandFromJava(String command,String fn, String arg1,String arg2) throws Exception
   {
  try
    {
         System.out.println(System.getProperty("user.name")); 
         ProcessBuilder pbuilder = new ProcessBuilder("/bin/bash",command,fn,arg1,arg2);
         System.out.println(pbuilder.command());
            pbuilder.redirectErrorStream(true);
            Process p = pbuilder.start();
        p.waitFor();
    }
    catch(Exception ie)
    {
        throw ie;
    }
}

需要执行的命令

"/bin/bash /abs/path/to/script.sh  /abs/path/to/doc/in/data-folder maxpages=30 maxsearches=3"

PS :我已经关注了this问题,但它没有帮助。我还尝试了其他选项,例如Runtime.exec()bash/bin/bash//bin/bash/ -c,其中一些选项根本不起作用,其他选项则没有结果。

1 个答案:

答案 0 :(得分:0)

尝试使用Runtime并检查标准错误以找出问题所在(可能是权限或路径):

// run command
String[] fixCmd = new String[] { "/bin/bash", "/abs/path/to/script.sh", "/abs/path/to/doc/in/data-folder", "maxpages=30", "maxsearches=3" };
Process start = Runtime.getRuntime().exec(fixCmd);

// monitor standard error to find out what's wrong
BufferedReader r = new BufferedReader(new InputStreamReader(start.getErrorStream()));
String line = null;
while ((line = r.readLine()) != null) {
    System.out.println(line);
}