CentOS 6.4 のリモート マシンでデーモンとして実行する必要がある Python プログラム (いくつかのスクリプト) があります。だから、Upstartが進むべき道だと思いました。
基本的な要件は次のとおりです。
- デーモンアプリを簡単に起動/停止する方法
 - クラッシュした場合のアプリの再起動
 - アプリは非特権ユーザーで実行する必要があります
 - SIGHUP を処理して構成をリロードできるようにする
 
そのサーバーの Upstart バージョンは 0.6.5 であるため、スタンザsetuidおよびsetgidは使用できません (これらは 1.4 でのみ表示されます)。したがって、クックブックの公式の回避策を使用します。アプリを開始/停止できますが、主な問題は、アプリがリロード信号を受信していないことです。
問題を再現できる削除されたスクリプトを提供します。
Python スクリプト ( app.py):
import os
import time
import signal
import logging
logging.basicConfig(filename='hup.log', level=logging.INFO,
    format="%(asctime)s: %(levelname)s: %(message)s")
log = logging.getLogger(__name__)
running = True
def run():
    log.info('PROGRAM STARTUP')
    log.info('Current pid: %d' % os.getpid())
    while running:
        log.info('Doing some hard work')
        time.sleep(10)
    else:
        log.info('PROGRAM TEARDOWN')
def signal_handler(signum, frame):
    log.info("Received Signal: %s at frame: %s" % (signum, frame))
    if signum == signal.SIGTERM:
        log.info('Received request to terminate daemon (SIGTERM)')
        global running
        running = False
    elif signum == signal.SIGHUP:
        log.info('Received reload config request (SIGHUP)')
        pass  # reload config here
signal.signal(signal.SIGHUP, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
run()
および Upstart 構成 ( hup.conf):
start on runlevel [2345]
stop on runlevel [!2345]
respawn
respawn limit 10 5
chdir /home/dev/prj/im
script
    # activate the virtual environment
    . /home/dev/.virtualenvs/myvenv/bin/activate
    # This line runs script as root
    # exec python app.py
    # this is official workaround for running prcesses as different
    # user in upstart version prior to 1.4
    # Run as user 'dev'
    exec su -s /bin/sh -c 'exec "$0" "$@"' dev -- python app.py
end script
出力 (ご覧のとおり、実際のプロセスpython app.pyは、upstart ショーとは異なる PID を持っています):
[dev@localhost ~]$ sudo start hup
hup start/running, process 8608
[dev@localhost ~]$ ps -elf | grep app.py
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root      8608     1  0  80   0 - 16143 wait   19:53 ?        00:00:00 su -s /bin/sh -c exec "$0" "$@" dev -- python app.py
4 S dev       8613  8608  0  80   0 -  7866 poll_s 19:53 ?        00:00:00 python app.py
[dev@localhost ~]$ sudo reload hup
[dev@localhost ~]$ sudo stop hup
hup stop/waiting
ログには、リロード信号が受信されていないことが示されています。
2013-09-19 20:00:36,092: INFO: PROGRAM STARTUP
2013-09-19 20:00:36,093: INFO: Current pid: 8613
2013-09-19 20:00:36,093: INFO: Doing some hard work
2013-09-19 20:00:45,287: INFO: Received Signal: 15 at frame: <frame object at 0xba2dd0>
2013-09-19 20:00:45,287: INFO: Received request to terminate daemon (SIGTERM)
2013-09-19 20:00:45,287: INFO: PROGRAM TEARDOWN
しかし、で行のコメントを外すhup.confとexec python app.py(そして でコメントするexec su...)、アプリがルートとして実行されていることを除いて、すべてが機能します。
[dev@localhost ~]$ sudo start hup
hup start/running, process 8811
[dev@localhost ~]$ ps -elf | grep app.py
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root      8811     1  0  80   0 -  8412 poll_s 20:13 ?        00:00:00 python app.py
[dev@localhost ~]$ sudo reload hup
[dev@localhost ~]$ sudo stop hup
hup stop/waiting
ログ ファイルは、SIGHUP シグナルが受信されたことを示します。
2013-09-19 20:13:40,290: INFO: PROGRAM STARTUP
2013-09-19 20:13:40,290: INFO: Current pid: 8811
2013-09-19 20:13:40,291: INFO: Doing some hard work
2013-09-19 20:13:59,739: INFO: Received Signal: 1 at frame: <frame object at 0x7d44c0>
2013-09-19 20:13:59,739: INFO: Received reload config request (SIGHUP)
2013-09-19 20:13:59,739: INFO: Doing some hard work
2013-09-19 20:14:04,313: INFO: Received Signal: 15 at frame: <frame object at 0x7d44c0>
2013-09-19 20:14:04,313: INFO: Received request to terminate daemon (SIGTERM)
2013-09-19 20:14:04,313: INFO: PROGRAM TEARDOWN
私の主な質問はreload、この古いバージョンのupstartで別のユーザーでスクリプトを実行するときにコマンドを機能させる方法ですか?