【问题标题】:Cannot Create Directory On Server. Permission Issue?无法在服务器上创建目录。权限问题?
【发布时间】:2013-05-26 06:44:50
【问题描述】:

我正在使用 lucene 来存储一些数据的索引。以下代码检查 /home/username 中是否存在目录,如果未找到,则从头开始构建索引,创建目录等。

public static final String INDEX_PATH = "/home/username/appname/lucene/index";
private void buildCompleteIndex(int organizationId) {
        synchronized(mutex) {
        File path = new File(INDEX_PATH + "/" + String.valueOf(organizationId));
        if(!path.exists()) {            
            try {
                Utils.deleteDirectory(path);
            } catch (IOException e) {
                throw new LuceneIndexException("Error rebuilding index directory.", e);
            }
            path.mkdirs();
        }

        List<Contact> contactList = contactDAO.findAll(organizationId, true);
        if(contactList != null) {
            for(Contact contact : contactList) {
                add(contact);
            }
        }
    }
}

//Getters
private IndexReader getIndexReader(boolean readOnly, int organizationId) {
    try {
        if(directory == null) {
            File path = getFile(organizationId);
            directory = FSDirectory.open(path);
            if(!IndexReader.indexExists(directory)) {
                buildCompleteIndex(organizationId);
            }
        }
        return IndexReader.open(directory, readOnly);
    } catch (CorruptIndexException e) {
        buildCompleteIndex(organizationId);
    } catch (IOException e) {
        buildCompleteIndex(organizationId);
    }
    return null;
}

当我从 Eclipse 中的虚拟 tomcat 实例进行部署时,这一切在开发中都非常有效,但在生产服务器上失败了。

为什么我可以在开发模式下写入目录,但在应用程序部署在服务器上时却不能?我没有创建目录的权限吗?我正在使用 Ubuntu Server 12.10 和 Tomcat7。

如何在服务器上创建正确的文件夹和文件?

是否有我应该允许我的应用程序在服务器上写入的特定文件夹?它总是与我的开发箱上的主/用户文件夹一起工作,但可能在服务器上有所不同,因为在应用程序运行时用户实际上并未登录?

更新: 我检查了当前设置为 700 的文件夹的权限。这可能是问题吗?在生产服务器上将此文件夹设置为 666 或 777 是否安全?即使 /home/username 的用户名没有登录,这个文件夹是否可写?我知道 700 表示所有者拥有完全访问权限,但这是否包括 tomcat 应用程序?

更新:我尝试将 /home/username 的权限更改为 755,但同样的问题仍然存在。

堆栈跟踪显示尝试创建文件夹时生成的错误。

java.io.IOException: Cannot create directory: /home/ryandlf/thinkbooked.com/lucene/contacts/1
    at org.apache.lucene.store.NativeFSLock.obtain(NativeFSLockFactory.java:171)
    at org.apache.lucene.store.Lock.obtain(Lock.java:72)
    at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:1108)
    at com.thinkbooked.search.LuceneContactSearchEngine.getIndexWriter(LuceneContactSearchEngine.java:321)
    at com.thinkbooked.search.LuceneContactSearchEngine.add(LuceneContactSearchEngine.java:68)
    at com.thinkbooked.search.LuceneContactSearchEngine.buildCompleteIndex(LuceneContactSearchEngine.java:285)
    at com.thinkbooked.search.LuceneContactSearchEngine.getIndexReader(LuceneContactSearchEngine.java:303)
    at com.thinkbooked.search.LuceneContactSearchEngine.find(LuceneContactSearchEngine.java:150)
    at com.thinkbooked.search.LuceneContactSearchEngine.find(LuceneContactSearchEngine.java:145)
    at com.thinkbooked.handlers.ClientListSearchHandler.init(ClientListSearchHandler.java:49)
    at com.thinkbooked.event.EventListener.doPost(EventListener.java:59)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

【问题讨论】:

  • 已更新错误。
  • 您应该首先尝试在 catch 块中添加 printStackTrace 并查看导致异常的原因。然后回顾导致无限递归的逻辑。 (也可以给我们看看add() 的代码)
  • stackoverflow 正在发生,因为代码试图找到该文件夹​​,如果它不能创建它并继续前进。在这种情况下,永远无法创建文件夹,因此它只会继续尝试创建它。我认为这更多是由于某种原因无法在服务器上创建文件夹的问题。
  • 但是这个循环几乎肯定是由一些异常触发的。我在getIndexReader 中看到一个调用buildCompleteIndex 的catch 语句,后者调用add 并且从堆栈跟踪很容易推断出添加关闭了循环。要找到问题的根源,您应该了解根本原因。
  • 我认为这可能是权限问题。我知道 stackoverflow 只是我需要修复的一个设计缺陷,但不会导致“无法创建文件夹”问题,因为这在我的开发机器上运行良好。会不会是文件夹的权限问题?

标签: java io


【解决方案1】:

循环几乎肯定是由一些异常触发的。我在getIndexReader 中看到一个调用buildCompleteIndex 的catch 语句,后者调用add 并且从堆栈跟踪很容易推断add 关闭了循环。要找到问题的根源,您应该了解根本原因。

我不可能知道。第一次尝试是:用printStackTrace()System.exit() 替换catch 块中的所有代码,看看它是否会产生有关第一个Exception 的更多有用信息,它会触发其他所有内容。

【讨论】:

  • 我将修复 catch 块中的 stackoverflow。但我仍然认为问题的根源与没有创建文件夹的事实有关。正如我所提到的,代码在我的开发环境中运行良好。我假设服务器更严格一些,也许我正在尝试写入一个我实际上无法写入的文件夹?
  • 我向您询问原始异常的堆栈跟踪,因为我确信 Lucene 添加了一条错误消息,可以指出问题所在(但即使没有它,它仍然会知道您是否拥有CorruptIndexException 而不是IOException 很有用,对吧?);没有那个,只是过去的经验与相同的问题或疯狂的猜测。
  • 不用担心。这似乎确实是一个服务器问题,我不再有帮助您的专业知识,但也许您离找到答案更近了一步。也许也可以尝试 serverfault.com。 (如果我不得不猜测,我会说即使在将 755 分配给根目录之后,仍会创建具有受限访问权限的子目录,因此无法创建到 /ryandlf/thinkbooked.com/lucene/contacts/1 的完整路径。也许要在 Tomcat 中设置一些东西?但又一次,只是猜测。)
【解决方案2】:

根据我在原始问题中发布的问题的答案,在 Ubuntu 的标准打包版本的 tomcat 上,tomcat 以不同的用户名运行。要找到它,您可以从命令行使用以下命令:

ps aux | grep catalina

在我的情况下,它告诉我 tomcat 使用的用户名是 tomcat7。

要编辑默认的tomcat用户名,编辑配置文件:

/etc/default/tomcat7

第一行应该列出默认的 tomcat 用户名,接下来是组 ID,在我的例子中是相同的。

要将文件夹的所有权更改为 tomcat,以便它可以写入目录,请使用 chmod 命令。

sudo chown -R username:group directory

-R 表示所有子文件夹和文件也将拥有新的所有权。如果您不想这样做,请忽略它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2013-03-20
    • 2016-03-05
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多