我想在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
无关,因为你没有发布抛出的实际异常(这会有很大帮助),我只能猜测出了什么问题,所以请检查以下内容:
-
脚本没有执行权限(很容易被
chmod +x path/to/script.sh
修复)-在这种情况下,你会得到带有类似Permission denied
或类似的消息的IOException
-
系统找不到您的脚本,因为您使用的是相对路径(脚本名称开头没有
/
)在这种情况下,请使用完整的脚本名称,例如/home/user/foo/script.sh
或使用正确的相对路径../foo/script.sh
-在通过exec运行脚本之前,您应该检查脚本是否存在(如何检查Java中是否存在文件?) -
注意,脚本可能是用运行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
它工作时没有任何错误。