【问题标题】:java.io.IOException: Permission denied with Xugglejava.io.IOException:权限被 Xuggle 拒绝
【发布时间】:2016-05-20 06:15:43
【问题描述】:

我正在尝试在服务器上运行 Xuggle 5.4,但出现了一个我不知道如何处理的异常。相同的代码在另外两台服务器上运行良好,并且在另一个应用程序(Playframework)下的同一台服务器上运行良好。它在另一个应用程序下运行的事实让我认为这可能是问题所在。

错误的根源似乎是 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

【问题讨论】:

  • 这个失败的程序是以什么用户身份运行的?它试图将临时文件粘贴在哪里?谁拥有它试图粘贴临时文件的目录以及该目录的权限是什么?也许您可以在strace 之类的命令下运行该程序,以尝试查看它尝试创建临时文件的位置。
  • 用户与Play所在目录相同!由用户运行并归用户所有。问题是我不知道它试图写入哪里,但也许像 strace 这样的工具可以工作。我可能会看看

标签: java xuggle xuggler


【解决方案1】:

那么问题是用于存储二进制文件的临时目录。由于另一个实例创建了这个临时位置,不同用户名下的第二个进程没有访问权限。 开发人员现在已经意识到了这个问题。删除临时目录或授予权限即可解决问题

【讨论】:

  • 您找到解决此问题的方法了吗?我正在与类似的问题作斗争。 Xuggler 只是无法在服务器端创建文件。
  • 你必须弄清楚它正在使用的临时目录。我修改了代码以输出一个文本字符串来告诉我临时目录并授予所有权限。如果有多个用户,您可能需要在第一个用户创建目录和文件后再次执行此操作。
  • 也许会尝试一下,现在我们的后端master更改了用户的权限。
  • 我发现xuggle临时目录的目录是:“/temp/xuggle”
  • 成功了吗?对所有用户都具有完全写入权限,这对我有用。
【解决方案2】:

虽然这个问题已经很老了,而且 xuggle 已被弃用,但我想我还是会在查看这里的 cmets 后向其他人展示我是如何解决这个问题的。

可以设置 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. 此方法及其任何变体都不会在虚拟机的当前调用中再次返回相同的抽象路径名。

[...]

如果目录参数为空,则将使用系统相关的默认临时文件目录。默认临时文件目录由系统属性 java.io.tmpdir 指定。在 UNIX 系统上,该属性的默认值通常是“/tmp”或“/var/tmp”;在 Microsoft Windows 系统上,它通常是“C:\WINNT\TEMP”。调用 Java 虚拟机时,可以为该系统属性赋予不同的值,但不保证对该属性的编程更改对该方法使用的临时目录有任何影响。

见:

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

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    相关资源
    最近更新 更多