Umaskが無視された「Unicorn」を起動します
-
28-10-2019 - |
質問
私は使用しています 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()
構文は正しいですか?
解決
「ユニコーン」は新興企業環境の外でどのように振る舞いますか?まったく同じだと思いますが、これを確認してください(すべてを可能な限りシンプルに保ちます)。
Umask値は絶対的ではないことを忘れないでください:名前が示すように、それはマスクです - それは許可ビットを「減算」します 許可からビットから、アプリケーションがファイルを開いたり、ディレクトリを作成したりしたときに指定します. 。 Upstarts Umask Stanzaは私が見ることができるものから振る舞っているので、あなたの問題は、あなたに何があなたに何があなたにあるかを指定する必要があります。
ユニコーンのストレースを試して、それが実際に何をしているのかを確認してみてください。
strace -o /tmp/strace.log -fFv -s 1024 /opt/myproject/bin/unicorn --config-file ...
ユニコーンがいくつかのファイルやディレクトリを作成するのを待っていたので、それを停止/殺してファイルを見てください /tmp/strace.log.
「open(file)」のgrepは、ファイルが作成したファイルの1つの名前であり、3番目の引数がOpen System Callに何であるかを確認します。そのモード値がある場合、希望するファイルの権限を与えるためにUMask値を構築することができるはずです。これはユニコーンを想定していることに注意してください:
- 指定するモードと一致しています。
- Umask(2)を呼び出しません 自体 (これは、新興のUMask Stanzaをオーバーライドします)。
- chmod(2)/fchmod(2)を呼び出しません。
上記のプロセスに従った後、まだ新興企業に問題があると考えている場合、簡単なテストケース(ユニコーンは必要ありません)を提供し、ここでバグを上げてください。 https://bugs.launchpad.net/upstart/+filebug.
他のヒント
エグゼクティブスタンザからユニコーンを呼び出す代わりに、「umask >> /tmp /somefile」と呼ばれるスクリプトを呼び出す場合、そこに何が入りますか?それが予想される応答を与える場合、あなたの問題はユニコーンにあります。