0

upstart v1.4アプリケーションサーバーを起動するために使用していますunicorn.

構成ファイルは次のupstartようになります。

description "Unicorn Application Server"

start on network
stop on runlevel [!2345]

umask 0003
setuid unicorn
setgid myproject
chdir /opt/myproject/

respawn

exec /opt/myproject/bin/unicorn --config-file /opt/myproject/config/unicorn.rb --env production

少なくともディレクトリに対して0774は、プロセスが で実行されることが不可欠です。ug+rwxo+rユーザーとグループは、nginx サーバー、アップロード、スタッフのログインなどで共有されます。

ディレクトリが間違った権限で作成されていることがわかりました。

drw-rw-r-- 2 unicorn       myproject        4096 2012-01-13 06:58 20120113-0658-7704-4676

私の知る限り、私のアプリケーションではこれを引き起こしているものは何もありません。

プロセスにアタッチgdbして を呼び出すcall umask(0)と、有効な umask は75、または になり0o113ます。

gdbセッションは次のとおりです。

root@1:/opt/myproject# cat ./tmp/pids/unicorn.pid 
7600

root@1:/opt/myproject# gdb
GNU gdb (GDB) 7.1-ubuntu

(gdb) attach 7600
Attaching to process 7600

(gdb) call umask(0)
$1 = 75

(gdb) call umask(75)
$2 = 0

(gdb) q
Quit anyway? (y or n) y
Detaching from program: /usr/local/bin/ruby, process 7600

root@1:/opt/myproject# ruby -e 'printf("%o\n", 75)'
113

の umask は、113に対して作成されたアクセス許可を説明します664。これは、私が見ているように見えます。

ここで私は何を間違っていますか? 新興企業は私のスタンザを無視していますか? スタンザを003ではなくとして定義する必要があり0003ますか? 私のgdbセッションは機能しており、%o printf()構文は正しいですか?

4

2 に答える 2

1

「ユニコーン」は Upstart 環境の外でどのように動作しますか? まったく同じだと思いますが、これを確認してください(すべてをできるだけ単純にしてください)。

umask 値は絶対値ではないことに注意してください。名前が示すように、これはマスクです。アプリケーションがファイルを開いたり、ディレクトリを作成したりするときに、アプリケーションが指定する許可ビットから許可ビットを「減算」します。Upstarts umask スタンザは私が見ることができるものから動作しているため、書き込み用にファイルを開いてディレクトリを作成するときに、奇妙なセットの許可ビット (モード) を指定するこのユニコーン アプリケーションに問題があるに違いありません。

unicorn をトレースして、実際に何をしているかを確認してください。

  strace -o /tmp/strace.log -fFv -s 1024 /opt/myproject/bin/unicorn --config-file ...

ユニコーンがいくつかのファイルやディレクトリを作成するのを待った後、それを停止/強制終了/tmp/strace.log.し、「open(FILE)」のファイル grep を調べます。ここで、FILE は、たとえば作成するファイルの 1 つの名前であり、3 番目の引数が何であるかを確認します。 open システムコールに。そのモード値がある場合、必要なファイル権限を与えるために umask 値を構築できるはずです。これは、ユニコーンが次のことを前提としていることに注意してください。

  • 指定されたモードと一致しています。
  • umask(2)自体は呼び出しません ( Upstart の umask スタンザをオーバーライドします)。
  • chmod(2)/fchmod(2) を呼び出しません。

上記のプロセスを実行しても Upstart に問題があると思われる場合は、簡単なテスト ケース (ユニコーンを必要としないもの) を提供し、https ://bugs.launchpad.net/ でバグを報告してください。 upstart/+filebug .

于 2012-01-16T10:09:16.043 に答える
1

exec スタンザから unicorn を呼び出す代わりに、"umask >> /tmp/somefile" を呼び出すだけのスクリプトを呼び出すと、そこには何が含まれますか? 期待どおりの応答が得られた場合、問題はユニコーンにあります。

于 2012-01-13T14:46:02.540 に答える