【问题标题】:Is it possible to completely manage the life cycle of a process and its forks?是否可以完全管理进程及其分支的生命周期?
【发布时间】: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 unix process operating-system


【解决方案1】:

(1) “停止所有程序 P 的进程,包括子进程/分叉”的动作必须是可能的。 (2)“找到属于程序P的所有进程”这个动作必须是可能的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多