Linux:用户定义的守护进程/服务

我正在寻找一个框架/库/环境,所以普通用户可以设置它自己的服务器进程。 这些进程应该像任何其他用户进程一样运行在他的uid下。

然而,应该启动哪些进程的定义,以及他们得到的参数等等,都应该由普通用户指定,而不需要额外的权限。 对我来说,这很重要,而不需要用户真正login。理想情况下,它应该与SYSV init一起工作,但基于systemd的东西也可以。

示例/用例:

  • nginx uwsgi / fast cgi进程
  • MongoDB实例
  • 不同的build设者为持续集成服务器

所有这些都有共同之处,我可能想要启动同一个二进制文件的多个实例(具有不同的参数),并且这些参数可能需要定期更改。 但是用户应该能够调整所有这些,而不需要root权限。

任何build议/指针如何可以在Linux中实现?

编辑:最低要求只是启动用户进程,但显然会有更先进的控制机制的需要。 例如,应该有一个简单的方法来查询服务是否正在运行,停止实例,重新启动它,重新加载它,…

cron为此提供了@reboot前缀(Vixie,也许还有其他的风格,请检查man 5 crontab )。 用户将使用crontab来创build/编辑自己的crontab文件,并指定

 @reboot /some/path/command -flags --moreflags 

这个用户会在启动时运行这个命令。

这将是大约10行的shell脚本,为什么你需要一个框架/库/环境?

作为一个简单的例子,使用sysV init ….

 #!/bin/bash . /etc/rc.d/init.d/functions . /etc/sysconfig/network DAEMON_USERS=`cat /etc/daemon_users` CMD="$1" for DUSER in $DAEMON_USERS ; do DSCRIPTS=`ls /home/${DUSER}/init/` for DFILE in DSCRIPTS ; do if [ -x "/home/${DUSER}/init/${DFILE}" -a ! -d "/home/${DUSER}/init/${DFILE}" ] then su -c $DUSER /home/${DUSER}/init/${DFILE} $CMD fi done done 

如果你真的想允许它们以root身份运行,那么删除'su -c $ DUSER'并将它们添加到sudoers中,这样它们就可以在不重启的情况下重新启动/添加东西。

所以…只要以你想运行用户身份启动应用程序, 不要试图访问任何需要root的东西 (比如特权端口,只能被root用户读取的文件等等)?

如果你想自动启动这些守护进程,并通过SysV init进程来控制它们,你需要为每一个指定参数创build一个初始化脚本(或者从非特权用户拥有写权限的文件中读取它们)并使用su -c或类似的方法启动守护进程,但是要小心 :这样做有严重的安全隐患(一个精心制作的“参数”文件可以让用户执行任意代码,就像用户运行你的init序列,通常是root)。
DerfK提到了cron @reboot选项,这可能是一个更好的select(安全风险较低),但是pipe理员需要知道这些程序将由cron启动。