2016-06-08 38 views
0

我想在watch服务类中运行shell脚本,在新文件添加到文件夹后运行shell。 观看服务工作正常,但是当我想要添加Runtime.getRuntime().exec("home/user/test.sh");我收到错误。 我只是在此之后添加运行时间:在java中运行shell观看服务

// Dequeueing events 
        Kind<?> kind = null; 
        for(WatchEvent<?> watchEvent : key.pollEvents()) { 
         // Get the type of the event 
         kind = watchEvent.kind(); 
         if (OVERFLOW == kind) { 
          continue; //loop 
         } else if (ENTRY_CREATE == kind) { 
          // A new Path was created 
        Path newPath = ((WatchEvent<Path>) watchEvent).context(); 
          // Output 
          System.out.println("New path created: " + newPath); 
          Runtime.getRuntime().exec("home/user/test.sh") 

我该怎么办?

+0

您使用的是哪个版本的java?这也确实是错误的,为什么不能从代码中调用shell脚本? – jgr208

+0

我正在使用java版本1.7。我知道这是错误的。从字面上我不知道该怎么办。但要求是,我必须观察一个文件夹,当新文件添加,在命令行运行特定的脚本 – Aira

+0

我很确定java有一个文件夹监视器API,你没有使用。还有没有什么理由你不能把这个脚本放在系统上,并在代码中调用? – jgr208

回答

0

我与运行脚本的事情的问题有没有关系WatchService,因为你不张贴实际的异常是引发(这将有很大的帮助),我只能猜测什么是错的,那么请检查:

  1. 脚本没有权限来执行(由chmod +x path/to/script.sh轻易可以解决的) - 在这种情况下,你会得到IOException有消息像Permission denied或类似

  2. 系统无法找到你的脚本,因为您使用相对路径(否/在脚本名称的开头)在这种情况下,ether使用完整的脚本名称,例如/home/user/foo/script.sh或使用适当的相对路径../foo/script.sh - 如果脚本存在通过EXEC在运行它之前,你应该检查(How do I check if a file exists in Java?

  3. 要注意的是脚本可能与工作运行Java程序的目录被称为 - 所以你应该通过新创建的文件路径

    if (OVERFLOW == kind) { 
             continue; //loop 
            } else if (ENTRY_CREATE == kind) { 
             // A new Path was created 
             Path newPath = ((WatchEvent<Path>) watchEvent).context(); 
             // Output 
             System.out.println("New path created: " + newPath); 
             Runtime.getRuntime().exec(new String[] { "/home/xxx/foo.sh", newPath.toString() }); 
            } 
    

    和脚本:参数脚本

我跟着您正在使用的代码的教程,使之独立于它的位置

#!/bin/bash 
echo "FILE CREATED: $1" >> /home/xxx/watch_dir.log 

它的工作没有任何错误。