限制用户可以使用pipe理员重新启动哪个进程?

我曾经使用主pipe来pipe理一个运行Django站点的Gunicorn进程,尽pipe这个问题可能与pipe理员正在pipe理的任何东西有关。 以前我是pipe理和使用我们服务器的唯一人员,而且pipe理员只是以root身份运行,我会在需要时使用sudo来运行supervisorctl restart myapp

现在我们的服务器必须支持在不同地点工作的多个用户,每个项目都需要能够重新启动他们自己的gunicorn进程,而不能重新启动其他用户的进程。

我跟着这个博客文章:

http://drumcoder.co.uk/blog/2010/nov/24/running-supervisorctl-non-root/

并能够允许非root用户使用supervisorctl,但现在任何人都可以重新启动其他人的进程。 从外观上看,主pipe没有办法做每个用户的访问控制。

任何人有任何想法如何让用户只重新启动自己的进程没有根?

编辑:我们曾经想过的一些事情包括编写一个脚本所拥有的suid位设置,只包含supervisorctl restart myapp并将其放在拥有myapp的用户的目录中的一个脚本。 互联网似乎是说,如果做错了,这样的脚本是不安全的。 我们还考虑编写一个自定义守护进程来监听来自特定用户的命令,并在用户有权限的情况下重新启动监督进程。 如果简单的解决scheme可行,这个想法似乎过于复杂。

    你可以使用sudo代替你的自定义脚本来完成同样的事情。 也就是说,给定默认的supervisordconfiguration,其中只有root可以运行supervisorctl ,你可以把这样的一个条目放到/etc/sudoers

     alice ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app1 bob ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app2 

    这将允许alice以root身份运行sudo /usr/bin/supervisorctl restart app1 ,而不必提供密码,并且允许bob重新启动app2