用java在watch服务内部运行shell



我想在watch服务类中运行shell脚本,以便在新文件添加到文件夹后运行shell。手表服务运行良好,但当我想添加Runtime.getRuntime().exec("home/user/test.sh")时;我收到错误。我只是在这之后添加Runtime:

// 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")

我该怎么办?

我认为运行脚本的问题与WatchService无关,因为你没有发布抛出的实际异常(这会有很大帮助),我只能猜测出了什么问题,所以请检查以下内容:

  1. 脚本没有执行权限(很容易被chmod +x path/to/script.sh修复)-在这种情况下,你会得到带有类似Permission denied或类似的消息的IOException

  2. 系统找不到您的脚本,因为您使用的是相对路径(脚本名称开头没有/)在这种情况下,请使用完整的脚本名称,例如/home/user/foo/script.sh或使用正确的相对路径../foo/script.sh-在通过exec运行脚本之前,您应该检查脚本是否存在(如何检查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

它工作时没有任何错误。

相关内容

  • 没有找到相关文章

最新更新