2016-06-08 3 views
0

Я хочу запустить сценарий оболочки внутри класса обслуживания часов, чтобы запустить оболочку после добавления нового файла в папку. Служба просмотра работает отлично, но когда я хочу добавить Runtime.getRuntime().exec("home/user/test.sh"); Я получил ошибку. Я просто добавить Время воспроизведения после этого:Запустить оболочку внутри службы часов в java

// 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 вы используете? также действительно действительно неправильно, что вы сделали, по какой-либо причине, почему нельзя вызвать сценарий оболочки из кода? – jgr208

+0

Я использую java версию 1.7. Я знаю, что это неправильно. в буквальном смысле я не знаю, что мне делать. Но требование состоит в том, что я должен наблюдать за одной папкой, когда добавляется новый файл, запускать определенный скрипт в командной строке – Aira

+0

. Я уверен, что java имеет API-интерфейс просмотра папок, который вы не используете. И снова есть ли какая-то причина, по которой вы не можете положить этот скрипт в систему и позвонить из кода? – jgr208

ответ

0

я вещь проблема с запуском скрипта, не имеет ничего общего с WatchService, так как вы не размещаете фактическое исключение, которое выбрасывает (что помогло бы много), я могу только догадываться, что это не так, пожалуйста, проверьте следующее:

  1. сценарий не имеет разрешения на выполнение (легко поправимо с помощью chmod +x path/to/script.sh) - в этом случае вы получите IOException с сообщением, как Permission denied или аналогичного

  2. система не может найти свой сценарий, так как вы используете относительный путь (нет / в начале имени сценария), в этом случае эфир использует полное имя скрипта, например. /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 

и он работал без ошибок.