我正在使用 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
113
的umask会考虑对 664
的权限,这似乎就是我所看到的 .
我在这里做错了什么,独角兽行为不端?新贵无视我的节吗?我应该将该节定义为 003
,而不是 0003
?我的 gdb
会话是否有效, %o
printf()
语法是否正确?
2 回答
如果您不是从exec节中调用unicorn而是调用一个只调用“umask >> / tmp / somefile”的脚本,它会放在那里?如果这给出了预期的响应,那么你的问题就在于独角兽 .
“独角兽”如何在Upstart环境之外表现?我猜的完全一样,但请检查一下(尽量保持一切尽可能简单) .
请记住,umask值不是绝对值:顾名思义,它是一个掩码 - 它"subtracts"权限位 from the permission bits your application specifies when it opens a file or creates a directory . Upstarts umask节的行为来自我所看到的所以你的问题必须在这个独角兽应用程序指定什么是一个奇怪的权限位(模式)当它打开文件写入和创建目录 .
尝试用独角兽来看看它实际上在做什么:
等待独角兽创建一些文件和/或目录,停止/终止它并查看文件
/tmp/strace.log.
grep for "open(FILE)"其中FILE是它创建的文件之一的名称,并查看第三个参数是什么对开放系统呼叫 . 当您具有该模式值时,应该可以构造一个umask值来为您提供所需的文件权限 . 请注意,这确实假设独角兽:与其指定的模式一致 .
不会调用umask(2)本身(它将覆盖Upstart umask节) .
不会调用chmod(2)/ fchmod(2) .
如果 - 在遵循上述过程之后 - 您仍然认为Upstart存在问题,请提供一个简单的测试用例(不需要独角兽)并在此处引发错误:https://bugs.launchpad.net/upstart/+filebug .