我正在使用 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
session :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
的权限,这似乎是我所看到的。我在这里做错了什么,是 unicorn 行为不端吗? Upstart 是否忽略了我的节?我应该将节定义为
003
,而不是 0003
?是我的gdb
session 工作和 %o
printf()
语法正确吗?
最佳答案
“ unicorn ”在 Upstart 环境之外的表现如何?我猜完全一样,但请检查一下(让一切尽可能简单)。
请记住,umask 值不是绝对值:顾名思义,它是一个掩码 - 它“减去”权限位 来自您的应用程序在打开文件或创建目录时指定的权限位 . Upstarts umask stanza 的行为从我所见,所以你的问题一定是这个 unicorn 应用程序在打开文件进行写入和创建目录时指定对你来说是一组奇怪的权限位(模式)。
尝试 stracing unicorn 看看它实际上在做什么:
strace -o /tmp/strace.log -fFv -s 1024 /opt/myproject/bin/unicorn --config-file ...
等待 unicorn 创建一些文件和/或目录后,停止/杀死它并查看文件
/tmp/strace.log.
grep for "open(FILE)"其中 FILE 是它创建的文件之一的名称,例如,查看 open 系统调用的第三个参数是什么。当您拥有该模式值时,应该可以构造一个 umask 值来授予您想要的文件权限。请注意,这确实假设 unicorn :如果 -- 在完成上述过程之后 -- 您仍然认为 Upstart 存在问题,请提供一个简单的测试用例(不需要 unicorn )并在此处提出错误:https://bugs.launchpad.net/upstart/+filebug .
关于ubuntu - Upstart `unicorn` 忽略 umask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8851848/