2016-06-08 57 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 

它的工作沒有任何錯誤。