既存のディレクトリでENOENTエラーが発生しました。

既存のディレクトリでENOENTエラーが発生しました。

背景:Redmineサーバーを実行しています。redmine DMSFプラグイン、xapianを使用して全文検索を提供します。 RedmineはPassengerで実行され、Nginxでホストされています。 Passengerプロセスは、ユーザー「redmine」とグループ「nginx」で実行されます。乗客の衣類とNginxが無効になっています。

Redmine ログには、xapian インデックスが見つからないというメッセージが表示されます。

REDMAIN_XAPIAN ERROR: Xapian database is not properly set, initiated or it's corrupted.
DatabaseOpeningError: Couldn't stat '/var/tmp/dmsf-index/english'

Running Passenger プロセスのトレースは次のようになります。

[pid  1013] stat("/var/tmp/dmsf-index/english", 0x7fa3bd112f00) = -1 ENOENT (No such file or directory)
[pid  1013] write(8, "REDMAIN_XAPIAN ERROR: Xapian dat"..., 88) = 88
[pid  1013] write(8, "DatabaseOpeningError: Couldn't s"..., 66) = 66

ルートとしてリストされたファイル:

775# ls -ahl /var/tmp/dmsf-index/english/
total 340K
drwxr-x--- 2 redmine nginx 4.0K Sep  5 13:04 .
drwxr-x--- 3 redmine nginx 4.0K Sep  5 13:04 ..
-rw-r----- 1 redmine nginx    0 Sep  5 14:00 flintlock
-rw-r----- 1 redmine nginx   28 Sep  5 13:04 iamchert
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 position.baseA
-rw-r----- 1 redmine nginx   16 Sep  5 13:04 position.baseB
-rw-r----- 1 redmine nginx  80K Sep  5 13:04 position.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 postlist.baseA
-rw-r----- 1 redmine nginx   17 Sep  5 13:04 postlist.baseB
-rw-r----- 1 redmine nginx 176K Sep  5 13:04 postlist.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 record.baseA
-rw-r----- 1 redmine nginx   14 Sep  5 13:04 record.baseB
-rw-r----- 1 redmine nginx 8.0K Sep  5 13:04 record.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 termlist.baseA
-rw-r----- 1 redmine nginx   14 Sep  5 13:04 termlist.baseB
-rw-r----- 1 redmine nginx  32K Sep  5 13:04 termlist.DB

そして、sudo -iを介してユーザー「redmine」とグループ「nginx」で複数のコマンドを実行します。

redmine@redmine:/var/tmp/dmsf-index/english$ pwd
/var/tmp/dmsf-index/english
redmine@redmine:/var/tmp/dmsf-index/english$ file .
.: directory
redmine@redmine:/var/tmp/dmsf-index/english$ ls
flintlock  iamchert  position.baseA  position.baseB  position.DB  postlist.baseA  postlist.baseB  postlist.DB  record.baseA  record.baseB  record.DB  termlist.baseA  termlist.baseB  termlist.DB
redmine@redmine:/var/tmp/dmsf-index/english$ file record.DB 
record.DB: data
redmine@redmine:/var/tmp/dmsf-index/english$ whoami
redmine
redmine@redmine:/var/tmp/dmsf-index/english$

私が知っている限り、権限エラー(通常はEACCESとマークされています)はありません。 NFSまたはCIFSがあいまいな場合はENOENTを返す可能性があることを読みましたが、これは/にマウントされたローカルext4パーティションです。

dmsf-indexの権限を再帰的に777に設定しようとしましたが、同じエラーが発生しました。

だから私の質問はPassenger / Redmineがディレクトリを見つけることができませんが、同じユーザーとして実行されるシェルはなぜ見つけることができるのかということです。

ベストアンサー1

Kusalanandaがchrootで正しい道を進んでいることがわかりました。

このシステムのnginx systemdユニットファイル設定PrivateTmp=trueによると文書以下を行います。

ブールパラメータを使用します。 trueの場合は、実行プロセスの新しいファイルシステム名前空間を設定し、その中にプライベート/ tmpおよび/ var / tmpディレクトリをマウントします。このディレクトリは、名前空間外のプロセスと共有されません。これはプロセスの一時ファイルに安全にアクセスするのに役立ちますが、/ tmpまたは/ var / tmpを介したプロセス間の共有はできません。

このオプションをfalseに切り替えると問題が解決します。

おすすめ記事