0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

A record of IO Exception 'Permission denied' on Tomcat 5.5

Posted at

会社にはとあるプロジェクトはTomcat 5.5で運行していた。サーバ移転のため他のサーバに配置し運行してみた。しかし、Excel Sheetなどを生成する際、ずっと失敗した。ログを見ると、ファイルへの権限が足りなかったと。

java.lang.RuntimeException: java.io.IOException: Permission denied
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:304)
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:320)
	at com.ouku.report.DIYBook.addSheet(DIYBook.java:146)
	at com.ouku.report.DIYBook.createBook(DIYBook.java:107)
	at com.ouku.report.DIYBook.writeBook(DIYBook.java:73)
	at com.ouku.report.ReportFactory.writeReport(ReportFactory.java:95)
	at com.ouku.report.ReportTask.doReportRequest(ReportTask.java:513)
	at com.ouku.report.ReportTask.doTask(ReportTask.java:105)
	at com.ouku.entities.report.ReportTimerTask$1.run(ReportTimerTask.java:12)
Caused by: java.io.IOException: Permission denied
	at java.io.UnixFileSystem.createFileExclusively(Native Method)
	at java.io.File.checkAndCreate(File.java:1833)
	at java.io.File.createTempFile0(File.java:1857)
	at java.io.File.createTempFile(File.java:1969)
	at org.apache.poi.xssf.streaming.SXSSFSheet$SheetDataWriter.<init>(SXSSFSheet.java:1244)
	at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:55)
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:300)
	... 8 more

最初はターゲットExcel Sheetファイルを書き込むべきディレクトリの権限が配置してなかったと思った。だが、すでに書くこむ権限があった。
そして、org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheetを検索して、結果として、これは臨時ファイルを利用した。どうやら、臨時ファイルが書き込めなかったのだろう。
だが、/tmpは疑問なく誰でも書き込める。一体、どこに書いたの。

また、そのツールを探していた。このツールの臨時ファイルは、Javaのjava.io.tmpdirで定義したところに書き込むはずだった。
わざわざJavaを書いた。

public class a {
	public static void main(String[] args){
		String tmpdir=System.getProperty("java.io.tmpdir");
		System.out.println("tmpdir="+tmpdir);
		String poitmp=System.getProperty("poi.keep.tmp.files");
		System.out.println("poitmp="+poitmp);
	}
}

もちろん、出力は別に何の用もなかった。

tmpdir=/tmp
poitmp=null

偶然、Tomcatのプロセスを調べた。

root@X:/opt/apache-tomcat-5.5.36/logs# ps aux|grep tomcat
admin    20909  6.0  1.8 4868880 301136 pts/0  Sl   09:06   0:33 /usr/lib/jvm/java-6-openjdk-amd64/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-5.5.36/conf/logging.properties -Dlog4j.configuration=file:///var/webapps/report/WEB-INF/log4j.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/opt/apache-tomcat-5.5.36/common/endorsed -classpath /opt/apache-tomcat-5.5.36/bin/bootstrap.jar -Dcatalina.base=/opt/apache-tomcat-5.5.36 -Dcatalina.home=/opt/apache-tomcat-5.5.36 -Djava.io.tmpdir=/opt/apache-tomcat-5.5.36/temp org.apache.catalina.startup.Bootstrap start
root     21093  0.0  0.0  10100   876 pts/0    S+   09:15   0:00 grep tomcat
root@X:/opt/apache-tomcat-5.5.36/logs#

はっきり、-Djava.io.tmpdir=/opt/apache-tomcat-5.5.36/tempと声明した。わはははは。

茶番劇のおしまいです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?