Upstart:以非特权用户身份运行服务,以 root 身份预启动脚本

Upstart:以非特权用户身份运行服务,以 root 身份预启动脚本

我有以下新贵工作:

description "posty api"


start on mysql
stop on shutdown

env RACK_ENV=production

setuid vmail
setgid vmail

chdir /opt/posty_api

pre-start script
    mkdir -p /var/run/posty
    chown -R vmail:root /var/run/posty
end script

exec /usr/local/bin/unicorn -D -c /opt/posty_api/unicorn.rb --env production >> /var/log/posty/upstart.log 2>&1

post-stop exec kill `cat /var/run/posty/unicorn.pid`

respawn
respawn limit 1 10

要创建文件夹,/var/run我需要 root 权限。我如何以 root 身份运行 upstart 作业的某些部分,并以非特权用户身份运行服务本身?

答案1

upstart没有与systemdPermissionsStartOnly设置等同的功能。作业中的所有进程都按照用户通过setuid正如食谱中所说。

所以按照 daemontools 的方式做事。

使用setuidgidsetuidgids6-setuidgidchpstrunuid, 或者setuidgid在以下exec诗节中:

执行\
setuidgid 某人 \
独角兽-D-c /opt/posty_api/unicorn.rb --env 生产>> /var/log/posty/upstart.log 2>&1

顺便说一句,这是一个糟糕的日志记录机制。daemontools 方式将有一个正确的、自动循环的、可按需旋转的、大小限制的日志,使用multilogmultilogs6-logsvlogdtinylog, 或者cyclog. upstart然而,与这些整合起来很棘手,鉴于其expect机制

期望分叉
执行\
setuidgid 某人 \
独角兽-D-c /opt/posty_api/unicorn.rb --env 生产 2>&1 | \
在 /usr/local/bin/chdir /var/log/ \
setuidgid 日志 \
cyclog posty/独角兽/

(这chdir是包中的链式加载nosh,并不是绝对必要的。但它使事情变得更整洁一些。)

答案2

您可以在脚本块中使用 setguid,它只会影响给定的块。如下所示:

# Ubuntu upstart file at /etc/init/kafka.conf
description "kafka broker"

limit nofile 32768 32768

start on runlevel [2345]
stop on [!2345]

respawn
respawn limit 2 5

umask 007

kill timeout 300

pre-start script
    # here you are root
    ls -alh /root/
end script

chdir /usr/local/lib/kafka

script
    setuid kafka
    setgid kafka
    # here you are user/group kafka
    /usr/local/lib/kafka/bin/kafka-server-start.sh /usr/local/lib/kafka/config/server.properties
end script

相关内容