我正在寻找一个框架/库/环境,以便普通用户可以设置自己的服务器进程。这些进程应该像任何其他用户进程一样在他的 uid 下运行。
但是,哪些进程应该启动、它们获取的参数等应该由没有额外权限的普通用户指定。对我来说,重要的是,这不需要用户实际登录即可实现。理想情况下,它应该与 SYSV init 一起工作,但基于 systemd 的东西也可以。
示例/用例:
- nginx uwsgi/fast cgi 进程
- mongodb 实例
- 持续集成服务器的不同构建器
所有这些的共同点是,我可能想要启动同一个二进制文件的多个实例(使用不同的参数),并且这些参数可能需要定期更改。但是,用户应该能够调整所有这些,而无需 root 权限。
有什么建议/指示可以在 Linux 中实现这一点吗?
编辑:最低要求只是启动用户进程,但显然需要更高级的控制机制。例如,应该有一种简单的方法来查询服务是否正在运行、停止实例、重新启动实例、重新加载实例……
答案1
cron
前缀提供了此功能@reboot
(Vixie,也许还有其他版本,请查看man 5 crontab
)。用户可以使用它crontab
来创建/编辑自己的 crontab 文件,并指定
@reboot /some/path/command -flags --moreflags
将以该用户身份在启动时运行该命令。
答案2
这大约是 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,以便他们可以重新启动/添加东西而无需重新启动。
答案3
所以就开始该应用程序作为您希望以哪个用户身份运行和不要尝试访问任何需要 root 权限的内容(例如特权端口,只能由 root 读取的文件等等)?
如果您想要自动启动这些守护进程并通过 SysV init 进程控制它们,您将需要为每个守护进程创建一个 init 脚本,该脚本指定参数(或从非特权用户有写权限的文件中读取它们)并使用或su -c
类似方式启动守护进程,但谨防:这样做严肃的安全隐患(精心设计的“参数”文件可以让用户以运行 init 序列的用户身份执行任意代码,该用户通常是 root 用户)。DerfK
提到了 cron@reboot
选项,这可能是更好的选择(安全风险较小),但您的管理员需要注意这些程序将由 cron 启动……