2012-01-25 54 views
3

考慮一個管理用戶定義程序的系統:是否有可能完全管理流程及其分支的生命週期?

  • 程序可以是任何東西。其命令行由一些配置文件中的非特權用戶定義。它可能是/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中是否有任何祕密?

+0

其實我發現這個,它暗示了Linux cgroups,我認爲我可以使用它:http://stackoverflow.com/questions/6936998/how-to-keep-track-of-all-descendant-processes-to-清理 –

回答

2

(1)必須可以執行「停止所有程序P的過程,包括子/叉」的操作。(2)「找到屬於程序P的所有進程」的動作必須是可能的。

cgroups實現這一點,而systemd也許是迄今爲止最重要的用戶,以利用(2)實現(1)。您可以跳出進度組,但不能使用cgroup。

相關問題