【发布时间】:2012-02-18 18:18:32
【问题描述】:
考虑一个管理用户定义程序的系统:
- 程序可以是任何东西。它的命令行是由非特权用户在一些配置文件中定义的。可以是
/bin/ls,也可以是/usr/sbin/apache;用户可以指定允许他开始的任何内容。 - 每个程序都以非 root 用户身份运行。
- 任何给定的用户都可以配置任意数量的程序。
- 每个程序都可以随心所欲地运行。
- 每个程序都可以调用
fork()、exec()等。 - 每个程序都可以将自己设置为会话负责人(即
setsid())。 - 启动程序的系统可能不会连续运行。它启动一个程序,然后退出。
- “停止所有程序 P 的进程,包括子进程/分叉”的操作必须是可能的。
- “查找属于程序 P 的所有进程”的操作必须是可能的。
问题来了:如何在 Linux 进程模型中提供这样的系统?
天真的方法:
- 使用
fork()、exec()、setuid()等启动程序。 - 将子 PID(加上其起始时间戳,从
/proc/stat开始,以唯一且永久地标识它)写入文件。 - 要停止单个进程,请将
SIGTERM设置为 PID。 - 要查找所有进程,请检查
/proc以根据 PID 构建进程层次结构。
这种方法有一个大漏洞:任何进程都可能分叉并脱离其进程组。仅查看流程层次结构是不够的。程序创建新进程后,无法将其起源追溯到原始程序。
一种解决方法是确保每个程序都以唯一的 UID 启动。这是不可取的或特别不可行的,因为(人类)用户可以定义任意数量的程序;然后系统必须以编程方式为每个程序创建新的、唯一的用户。
到目前为止,我唯一的想法是在程序的初始进程中注入一个特殊的保留环境变量,即使用env PROGRAM=myprogram <command line> 运行程序。然后系统可以强制要求所有进程都必须继承其父级的环境。系统可以定期搜索/proc 并强制杀死任何缺少PROGRAM 环境变量的进程。
Linux 系统调用 API 中是否有任何我可以使用的秘密?
【问题讨论】:
-
其实我找到了这个,它建议使用Linux cgroups,我想我可以使用它:stackoverflow.com/questions/6936998/…
标签: linux unix process operating-system