시작 : 권한이없는 사용자로 서비스를 실행하고 루트로 사전 시작 스크립트 vmail:root /var/run/posty end script exec /usr/local/bin/unicorn -D -c /opt/posty_api/unicorn.rb

나는 다음과 같은 신생 직업을 가지고 있습니다.

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루트 권한이 필요합니다. 업 스타트 작업의 일부를 루트로, 서비스 자체를 권한이없는 사용자로 어떻게 실행할 수 있습니까?



답변

upstartsystemdPermissionsStartOnly설정 과 동등한 기능이 없습니다 . Cookbook이 말한 것처럼 작업의 모든 프로세스 setuid스탠자 를 통해 사용자가 설정 한대로 실행됩니다 .

따라서 daemontools 방식으로 작업하십시오.

사용 setuidgid, setuidgid, s6-setuidgid, chpst, runuid, 또는 setuidgid에서 exec연 :

exec \
누군가를 세우다 \
유니콘 -D -c /opt/posty_api/unicorn.rb --env 제작 >> /var/log/posty/upstart.log 2> & 1

그건 그렇고 끔찍한 로깅 메커니즘입니다. 데몬 툴즈 방법은 것 적절한 자동 순환, 회전 가능한 주문형, 크기 덮인 사용하여 로그인 multilog, multilog, s6-log, svlogd, tinylog, 또는 cyclog. upstart그러나 메커니즘에 따라expect 이들과 통합하기가 까다 롭습니다 .

포크를 기대하다
exec \
누군가를 세우다 \
유니콘 -D -c /opt/posty_api/unicorn.rb --env production 2> & 1 | \
/ usr / local / bin / chdir / var / log / \
setuidgid 로그 \
cyclog posty / unicorn /

( chdir여기서 nosh패키지 에서 체인로드하는 것이 있으며 엄격하게 필요하지는 않지만 다소 깔끔합니다.)


답변

스크립트 블록에서 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