我有以下新贵工作:
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
没有与systemd
的PermissionsStartOnly
设置等同的功能。作业中的所有进程都按照用户通过节setuid
正如食谱中所说。
所以按照 daemontools 的方式做事。
使用setuidgid
,setuidgid
,s6-setuidgid
,chpst
,runuid
, 或者setuidgid
在以下exec
诗节中:
执行\ setuidgid 某人 \ 独角兽-D-c /opt/posty_api/unicorn.rb --env 生产>> /var/log/posty/upstart.log 2>&1
顺便说一句,这是一个糟糕的日志记录机制。daemontools 方式将有一个正确的、自动循环的、可按需旋转的、大小限制的日志,使用multilog
,multilog
,s6-log
,svlogd
,tinylog
, 或者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