2012-05-04 5 views
1

Я пытаюсь запустить Xuggle 5.4 на сервере и имею исключение, с которым я не знаю, как справиться. Тот же код отлично работает на двух других серверах, а также на том же сервере под другим приложением (Playframework). Тот факт, что он работает под другим приложением, заставляет меня предположить, что это может быть ошибкой.java.io.IOException: Permission denied with Xuggle

Корень ошибки, похоже, заключается в том, что Xuggle пытается создать временный файл, и доступ запрещен. Как я могу понять, где это? Как уже упоминалось, возможно, это место, которое уже использовала другая установка, и которая работает под другой учетной записью пользователя.

Это трассировки стека:

2012-05-04 08:49:01,985 ERROR ~ could not create temp file: {} 
java.io.IOException: Permission denied 
    at java.io.UnixFileSystem.createFileExclusively(Native Method) ~[na:1.6.0_26] 
    at java.io.File.checkAndCreate(File.java:1704) ~[na:1.6.0_26] 
    at java.io.File.createTempFile(File.java:1792) ~[na:1.6.0_26] 
    at com.xuggle.ferry.JNILibrary.unpackLibrary(JNILibrary.java:274) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.loadFromClasspath(JNILibrary.java:195) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.load(JNILibrary.java:176) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.load(JNILibrary.java:158) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.FerryJNI.<clinit>(FerryJNI.java:16) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.Ferry.<clinit>(Ferry.java:25) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.xuggler.XugglerJNI.<clinit>(XugglerJNI.java:19) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.xuggler.IContainer.<clinit>(IContainer.java:1622) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.mediatool.MediaReader.<init>(MediaReader.java:137) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.mediatool.ToolFactory.makeReader(ToolFactory.java:77) [xuggle-xuggler-5.4.jar:5.4.0] 
    at logic.server.MediaCoder.createEncodingJobs(MediaCoder.java:39) [idoms-server:na] 
    at controllers.FileCopyJob$ProgressListener.actionPerformed(FileCopyJob.java:127) [idoms-server:na] 
    at controllers.FileCopyJob$DownloadCountingOutputStream.afterWrite(FileCopyJob.java:84) [idoms-server:na] 
    at org.apache.commons.io.output.ProxyOutputStream.write(ProxyOutputStream.java:92) [commons-io-2.0.1.jar:2.0.1] 
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1263) [commons-io-2.0.1.jar:2.0.1] 
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:1236) [commons-io-2.0.1.jar:2.0.1] 
    at controllers.FileCopyJob.doJob(FileCopyJob.java:58) [idoms-server:na] 
    at play.jobs.Job.doJobWithResult(Job.java:50) [play-1.2.4.jar:na] 
    at play.jobs.Job.call(Job.java:146) [play-1.2.4.jar:na] 
    at play.jobs.Job$1.call(Job.java:66) [play-1.2.4.jar:na] 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) [na:1.6.0_26] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) [na:1.6.0_26] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) [na:1.6.0_26] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) [na:1.6.0_26] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_26] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_26] 
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_26] 
2012-05-04 08:49:02,003 ERROR ~ could not create temp file: {} 
java.io.IOException: Permission denied 
    at java.io.UnixFileSystem.createFileExclusively(Native Method) ~[na:1.6.0_26] 
    at java.io.File.checkAndCreate(File.java:1704) ~[na:1.6.0_26] 
    at java.io.File.createTempFile(File.java:1792) ~[na:1.6.0_26] 
    at com.xuggle.ferry.JNILibrary.unpackLibrary(JNILibrary.java:274) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.loadFromClasspath(JNILibrary.java:195) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.load(JNILibrary.java:176) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.JNILibrary.load(JNILibrary.java:158) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.FerryJNI.<clinit>(FerryJNI.java:16) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.ferry.Ferry.<clinit>(Ferry.java:25) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.xuggler.XugglerJNI.<clinit>(XugglerJNI.java:19) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.xuggler.IContainer.<clinit>(IContainer.java:1622) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.mediatool.MediaReader.<init>(MediaReader.java:137) [xuggle-xuggler-5.4.jar:5.4.0] 
    at com.xuggle.mediatool.ToolFactory.makeReader(ToolFactory.java:77) [xuggle-xuggler-5.4.jar:5.4.0] 
    at logic.server.MediaCoder.createEncodingJobs(MediaCoder.java:39) [idoms-server:na] 
    at controllers.FileCopyJob$ProgressListener.actionPerformed(FileCopyJob.java:127) [idoms-server:na] 
    at controllers.FileCopyJob$DownloadCountingOutputStream.afterWrite(FileCopyJob.java:84) [idoms-server:na] 
    at org.apache.commons.io.output.ProxyOutputStream.write(ProxyOutputStream.java:92) [commons-io-2.0.1.jar:2.0.1] 
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1263) [commons-io-2.0.1.jar:2.0.1] 
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:1236) [commons-io-2.0.1.jar:2.0.1] 
    at controllers.FileCopyJob.doJob(FileCopyJob.java:58) [idoms-server:na] 
    at play.jobs.Job.doJobWithResult(Job.java:50) [play-1.2.4.jar:na] 
    at play.jobs.Job.call(Job.java:146) [play-1.2.4.jar:na] 
    at play.jobs.Job$1.call(Job.java:66) [play-1.2.4.jar:na] 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) [na:1.6.0_26] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) [na:1.6.0_26] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) [na:1.6.0_26] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) [na:1.6.0_26] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_26] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_26] 
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_26] 
2012-05-04 08:49:02,015 ERROR ~ Could not load library: xuggle; version: 5; Visit http://www.xuggle.com/xuggler/faq/ to find common solutions to this problem 
08:49:02,115 ERROR ~ 

@6a91glkdf 
Error during job execution (controllers.FileCopyJob) 

Oops: UnsatisfiedLinkError 
An unexpected error occured caused by exception UnsatisfiedLinkError: no xuggle in java.library.path 

play.exceptions.UnexpectedException: Unexpected Error 
    at play.Invoker$Invocation.onException(Invoker.java:244) 
    at play.jobs.Job.onException(Job.java:124) 
    at play.jobs.Job.call(Job.java:163) 
    at play.jobs.Job$1.call(Job.java:66) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.UnsatisfiedLinkError: no xuggle in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
    at java.lang.System.loadLibrary(System.java:1028) 
    at com.xuggle.ferry.JNILibraryLoader.loadLibrary0(JNILibraryLoader.java:268) 
    at com.xuggle.ferry.JNILibraryLoader.loadLibrary(JNILibraryLoader.java:171) 
    at com.xuggle.ferry.JNILibrary.load(JNILibrary.java:161) 
    at com.xuggle.ferry.FerryJNI.<clinit>(FerryJNI.java:16) 
    at com.xuggle.ferry.Ferry.<clinit>(Ferry.java:25) 
    at com.xuggle.xuggler.XugglerJNI.<clinit>(XugglerJNI.java:19) 
    at com.xuggle.xuggler.IContainer.<clinit>(IContainer.java:1622) 
    at com.xuggle.mediatool.MediaReader.<init>(MediaReader.java:137) 
    at com.xuggle.mediatool.ToolFactory.makeReader(ToolFactory.java:77) 
    at logic.server.MediaCoder.createEncodingJobs(MediaCoder.java:39) 
    at controllers.FileCopyJob$ProgressListener.actionPerformed(FileCopyJob.java:127) 
    at controllers.FileCopyJob$DownloadCountingOutputStream.afterWrite(FileCopyJob.java:84) 
    at org.apache.commons.io.output.ProxyOutputStream.write(ProxyOutputStream.java:92) 
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1263) 
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:1236) 
    at controllers.FileCopyJob.doJob(FileCopyJob.java:58) 
    at play.jobs.Job.doJobWithResult(Job.java:50) 
    at play.jobs.Job.call(Job.java:146) 
    ... 8 more 
+0

Что это пользователь неудачу программа работает как? Где он пытается вставить временный файл? Кому принадлежит каталог, в котором он пытается вставить временный файл и какие разрешения для этого каталога? Возможно, вы можете запустить программу под командой 'strace', чтобы попытаться увидеть, где она пытается создать временный файл. – QuantumMechanic

+0

Пользователь такой же, как в каталоге Play! выполняется от пользователя и принадлежит пользователю. Проблема в том, что я не знаю, где она пытается писать, но, может быть, инструмент, как strace, будет работать. Я мог бы посмотреть –

ответ

2

Тогда задача является временный каталог, используемый для хранения бинарных файлов. Поскольку другой экземпляр создал это временное местоположение, второй процесс под другим именем пользователя не имел права доступа. Разработчики знают о проблеме. Удаление справочника temp или предоставление прав решает проблему

+0

Вы нашли решение этой проблемы? Я борюсь с подобной проблемой. Xuggler просто не может создать файл на стороне сервера. – goodm

+0

Вы должны выяснить, какая временная директория используется. Я изменил код, чтобы вывести текстовую строку, чтобы сообщить мне каталог temp и дал все права на это. Если несколько пользователей, вам может понадобиться сделать это снова после того, как первый пользователь создал каталог и файлы. –

+0

Может быть, попробуем, прямо сейчас наш мастер-мастер изменил привилегии для пользователя. – goodm

0

Хотя этот вопрос довольно старый, и xuggle устарел, я думал, что все равно покажу другим, как я решил эту проблему после просмотра комментариев здесь.

Можно установить свойство java.io.tmpdir вместо удаления папки или изменения ее разрешений.

Как это, например:

java -Djava.io.tmpdir="~/custom/tempdir/" HelloWorld 

фона:

Как полагает комментарий от другого ответа, прослеживая корень проблемы обратно в функцию, которая создает временную папку вопрос, показывает, что java использует местоположение по умолчанию, которое можно настроить.

public static File createTempFile(String prefix, 
            String suffix, 
            File directory) 
          throws IOException 

Создает новый пустой файл в указанном каталоге, используя данные префикса и суффикса строки для создания его имя. Если этот метод успешно возвращает то гарантируется, что:

  1. был вызван Файл, обозначенный возвращенным абстрактным имя пути не существовало до этого метода, и
  2. Ни этот метод, ни любой из его вариантов будет возвращать то же самое abstract pathname снова в текущем вызове виртуальной машины.

[...]

Если аргумент каталога является пустым, то будет использоваться система в зависимости от каталога по умолчанию временного файла. Каталог временных файлов по умолчанию определяется системным свойством java.io.tmpdir. В системах UNIX значение по умолчанию этого свойства обычно равно «/ tmp» или «/ var/tmp»; в системах Microsoft Windows обычно это «C: \ WINNT \ TEMP». Другое значение может быть присвоено этому системному свойству при вызове виртуальной машины Java, но программные изменения этого свойства не гарантируют никакого влияния на временный каталог, используемый этим методом.

См:

  1. JavaDoc createTempFile(String, String, File)
  2. Old Google Groups discussion