質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

1回答

2538閲覧

LinuxのTomcat上で動作するWebアプリケーションでのファイル出力における制限について

Rearest

総合スコア6

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

1クリップ

投稿2017/11/09 09:04

###前提・実現したいこと
Tomcat上でJerseyを用いてRESTサービスを作成しており、その際に受け取った要求データを変換してファイルに書き出す処理を作成しています。
Windows上のTomcatでは問題がないのですが、Linux上のTomcat上で動作させると、${catalina.home}/webapps/(ApplicationName)配下以外に出力しようとするとFileNotFoundExceptionが発生してしまっています。
おそらくTomcatの設定ではないかと思うのですが、設定ファイルを見てもそれらしき設定が見えなく、困っています。
何が問題かわかる方がおられましたらよろしくお願いいたします。

###発生している問題・エラーメッセージ

java.io.FileNotFoundException: /path.../filename (許可がありません)

###該当のソースコード
例外処理などは除外しています。

java

1os = new FileOutputStream(aFileName); 2os.write(aContents, 0, aContents.length); 3os.close();

###試したこと
Tomcatをrootで起動しても書き込めず、tomcatユーザで起動した際に、該当ディレクトリの権限を付与してもだめでした。

###補足情報(言語/FW/ツール等のバージョンなど)
・Windows側
Tomcat 7.0.53 + OracleJDK 1.7.0_79
・Linux側
Tomcat 7.0.76 + OpenJDK 1.7.0_151

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Windowsだと動作してLinuxだと動作しない例として、パーミッションが原因以外では大文字小文字が正しくない(例えばアプリケーション名)場合があります。

余談ではありますが、${catalina.home}/webapps/(アプリケーション名) 以下にファイルを出力されておりますが、アプリケーションをwar形式で再デプロイ→Tomcat再起動をするとファイルを失うかと思いますので、webapps以下ではなく、他のディレクトリの方が良いでしょうか。

投稿2017/11/10 00:21

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Rearest

2017/11/10 11:38

回答ありがとうございます。 単純に/opt/tmp(パーミッション、オーナーは問題なし)とかでも書けないのです。 ただ、読み取りはできるので、何らかの要因で読み取り専用状態になってしまっている模様です。 なお、今回のファイル出力は一時ファイルであるため、デプロイで消滅するのは問題ありません。
kuniku

2017/11/10 17:02 編集

読み取りはできるというのは、書き込みができない時にアプリケーション内(war内のクラス)から読み取りできるのでしょうか? FileNotFoundExceptionが発生する事象として OSのtomcatを実行するユーザのulimit ファイル・ディスクリプタ数の上限に達しているかもしれません。 上限を増やしてみる。 参考:http://tweeeety.hateblo.jp/entry/20131220/1387508776 ulimit と合わせて考える際に、IOのclose漏れがないか( try finally 節でのcloseできているか、try-with-resources使っているか) /tmp であっても書き込みできないのか?
Rearest

2017/11/10 22:22

アプリケーション内からの読み込みは可能です。 「書き込み→別の場所から読み込み」(Webアプリケーションと非Webアプリケーションでファイルによるデータのやりとりを行う。とりあえずこの方式自体に関しては変更不能。)と行った時、書き込み場所をwabapps配下、読み込み場所を/opt/tmpなどにした際、読み込み可能であることは確認できています。 Tomcat起動後の一度目のアクセスですら失敗するため、ディスクリプタの枯渇は少々考えづらいかもしれません。 /tmpに関しては試していないため、後日試してみたいと思います。 コメントありがとうございました。
Rearest

2017/11/13 13:26

とりあえず/tmpもダメでした。 何が悪いんだろう?
kuniku

2017/11/14 02:07

Linuxの環境は、VMwareの仮想化した中の1つのインスタンスだと 以下のようにファイル システムが読み取り専用になる事象があります、ただOS再起動しないと読み取りから回復できなかったりするので事象は違うかもしれません。 https://kb.vmware.com/s/article/1033362 仮想化している場合は、ストレージ側で何らか異常が起きてるとか?ストレージ側のログや Linux側の /var/log/messages などのログで何らか警告なり出ていないか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問