我建议你采取不同的方法。使用发行版中可用的系统工具来管理流程的生命周期,而不是自己生成流程。provisioner也会简单得多,因为它不必复制您的操作系统只需付出很少的努力就可以完成的任务。在
在Ubuntu/centos6系统上,可以使用Upstart,与旧的sysvinit相比,它有很多优点(激进的并行化、重生成、简单的init-config语法等)。在
还有一个SystemD在设计上类似于upstart,在OpenSuse中是默认的。在
然后,provisioner只能用于为每个服务创建所需的init config,并使用subprocess模块启动或停止它们。然后,您可以监视您的实例,以防upstart无法重新生成实例,并发送警报,或再次尝试启动服务。在
使用这种方法,可以将用户服务的所有实例彼此隔离。如果供应器崩溃,其余的服务将继续运行。在
例如,假设您的供应器在后台运行。它通过AMQP或其他方式获取一条消息来创建用户并为该用户启动服务。一个可能的流程是:创建用户
为新用户做任何需要的引导吗
创建/etc/init/[用户名]_服务.conf在
启动[用户名]服务
init脚本可能类似于:description "start Service for [username]"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
# Run before process
pre-start script
end script
exec /bin/su -c "/path/to/your/app"
通过这种方式,您可以将流程管理从供应器卸载到系统upstart守护进程。您只需要以一种简单的方式进行作业管理(在创建或删除用户时创建/销毁服务)。在