ubuntu - Upstart `unicorn` 忽略 umask

标签 ubuntu permissions posix unicorn upstart

我正在使用 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 :
  • 与它指定的模式一致。
  • 不调用 umask(2) 本身(这将覆盖 Upstart umask 节)。
  • 不调用 chmod(2)/fchmod(2)。

  • 如果 -- 在完成上述过程之后 -- 您仍然认为 Upstart 存在问题,请提供一个简单的测试用例(不需要 unicorn )并在此处提出错误:https://bugs.launchpad.net/upstart/+filebug .

    关于ubuntu - Upstart `unicorn` 忽略 umask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8851848/

    相关文章:

    c - 希望信号量超过 SEM_VALUE_MAX

    android 权限 READ_CALENDAR & WRITE_CALENDAR

    linux - 须藤错误信息

    powershell - 如何测试特定 Active Directory 树位置是否允许使用 powershell 命令

    linux - APT 无法识别选项 --install-recommends

    python - 使用python扩展字符串中的环境变量

    linux - posix aio 和 freebsd aio 有什么区别?

    linux - GNU Parted 库以某种方式禁用分区打开

    bash - 编写可以访问用户数据的 Cron 作业

    ubuntu - 无法在命令行上打开 VS Code