2012-01-13 3 views
0

upstart v1.4私はアプリケーションサーバを起動するのにunicornと呼ばれています。umaskでアップストリーム `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です。これまでのところ、私は承知していますよう

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

:ユーザー&グループが、私はディレクトリが間違ったアクセス権で作成されていることを観察している

など、そのようなログインnginxのサーバー、アップロード、スタッフなどとして共有されています私のアプリケーションではこれを引き起こすものは何もありません。

プロセスにgdbを取り付け、そしてcall umask(0)を呼び出すによると、効果的なumaskが75、または0o113です。

ここgdbセッションです:

[email protected]:/opt/myproject# cat ./tmp/pids/unicorn.pid 
7600 

[email protected]:/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 

[email protected]:/opt/myproject# ruby -e 'printf("%o\n", 75)' 
113 

113のumaskのは、私が見ているものをあるように思われ、664に作られている権限を占めるでしょう。

私はここで間違っていますか?ユニコーンは何が違うのですか?アップスタットは私のスタンを無視していますか?スタンザを0003ではなく003と定義しますか?私のgdbセッションが正常に動作し、%oprintf()の構文が正しいですか?

答えて

1

「ユニコーン」はアップストリーム環境以外でどのように動作しますか?私はまったく同じことを推測しますが、これをチェックしてください(すべてをできるだけシンプルに保ってください)。

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

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

が/停止それを殺すし、「オープン(ファイルのファイルで/tmp/strace.log.のgrepを見て、いくつかのファイルおよび/またはディレクトリを作成するにはユニコーンを待った:

実際にやっているかを見るためにユニコーンをstracing試してみてください) "ここで、FILEは、例えば作成したファイルの1つの名前で、第3引数がオープンシステムコールの内容を参照します。そのモード値があるときは、umask値を構築して、必要なファイル権限を与えることが可能でなければなりません。これは、unicorn:

  • が指定するモードと一致していることに注意してください。
  • umask(2)自体を(これはUpstart umaskスタンザより優先します)とは呼びません。
  • は、chmod(2)/ fchmod(2)を呼び出しません。

場合 - 上記のプロセスを以下した後 - あなたはまだ成り上がりの問題があると思い、簡単なテストケースを提供してください(つまり、ユニコーン必要としない)、ここでバグを上げる:https://bugs.launchpad.net/upstart/+filebugを。

+0

実際に問題が起きたのは、Upstartが自動的に設定をリロードしていないということでした。なぜなら、新しく起動されて以来、upstartはconfigファイルを 'HUP'することなく正しく読み込みます。 'strace' tupのおかげで、とても助かりました。 –

1

exec stanzaからunicornを呼び出す代わりに、 "umask >>/tmp/somefile"という名前のスクリプトを呼び出すと、そこには何が置かれますか?それが期待される応答を与えるならば、あなたの問題はユニコーンになります。

+0

結局のところ、受け入れられた答えに記載されているように、素晴らしい提案が、解決されました。 –

関連する問題