実際のタスク:Linuxでプロセスツリーを復元する方法

私たちはCRIUプロジェクト(ユーザー空間のチェックポイント/復元)を開発しており、元のプロセスツリーを復元する方法についてかなり興味深いタスクがありました。 解決してみることをお勧めします。

挑戦する


CRIUは、プロセスの状態をディスクに保存し、後でこのマシンまたは他のマシンで解決できるユーティリティです。 回復サブタスクの1つは、プロセスツリーを復元するための一連のアクションを見つけることです。 入力には、各プロセスのパラメーターのセット(一意の識別子(PID)、親へのリンク(PPID)、およびセッション識別子(SID))が含まれます。

画像


Linuxがライブで処理するルール




チーム:




サンプル入力


入力データには、各プロセスの行が含まれています。 各行には、pid、ppid(親のpid)、sid、ゾンビフラグの3つの数値が含まれます。値は0(プロセスが停止している場合(「ゾンビ」)、1-プロセスが実行中の場合)です。

1 0 1 1
6 1 6 1
8 6 7 1
15 6 12 1
10 1 10 1
11 10 7 1
13 10 12 1

サンプル出力


1:フォーク(6)
6:フォーク(7)
7:setsid()
7:クローン(8、CLONE_PARENT)
7:終了()
6:待機()
8:フォーク(9)
9:フォーク(10)
10:フォーク(11)
10:フォーク(12)
12:setsid()
12:クローン(13、CLONE_PARENT)
12:クローン(14、CLONE_PARENT)
12:終了()
10:待機(12)
14:フォーク(15)
6:prctl(PR_SET_CHILD_SUBREAPER、1)
14:終了()
10:待機(14)
6:prctl(PR_SET_CHILD_SUBREAPER、0)
9:終了()
8:待機(9)
6:setsid()
10:setsid()

Source: https://habr.com/ru/post/J195330/


All Articles