是否有可能完全管理过程及其叉子的生命周期?

时间:2012-01-25 15:03:11

标签: linux unix process operating-system

考虑管理用户定义程序的系统:

  • 程序可以是任何东西。其命令行由某些配置文件中的非特权用户定义。它可以是/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中的秘密吗?

1 个答案:

答案 0 :(得分:2)

  

(1)必须能够“停止所有程序P的进程,包括儿童/叉子”。 (2)必须可以执行“查找属于程序P的所有进程”的操作。

cgroups实现了这一点,而systemd可能是迄今为止使用(2)实现(1)的最重的用户。你可以打破进度组,但不能打破cgroup。