次のようなバイナリがあります。
int RealMain() {
... runs forever ...
}
int main() {
clone(RealMain, ..., CLONE_NEWPID /*clone flags*/, ...);
_exit(0);
}
アイデアは、 clone() を介して実際のプロセスを起動し、終了するプロセスを起動することです。このモデルの理由は、「CLONE_NEWPID」フラグです。別の PID 名前空間でアプリを実行する必要があります。したがって、実際のアプリケーション プロセスは、CLONE_NEWPID フラグを使用してクローンを介して作成する必要があります。
コマンドラインからこのバイナリを起動すると、すべてうまくいきます。しかし、Upstart から起動すると、errno が EPERM に設定されて clone() が失敗し、新しい PID 名前空間が作成されません。上記の clone() 呼び出しのため、Upstart 構成で「expect fork」を使用しています。そうすることで、活性を RealMain() を実行する子プロセスの存続期間に関連付けることができます。
expect fork
respawn
「expect fork」の実装と、新しい PID 名前空間を作成する CLONE_NEWPID の使用との間に何らかの悪い相互作用があるかどうか疑問に思っています。「expect fork」と ptrace の問題に関する次の情報源を見つけましたが、CLONE_NEWPID に関する問題を報告している他の人は見つかりませんでした。
https://blueprints.launchpad.net/ubuntu/+spec/foundations-q-upstart-overcome-ptrace-limitations
ありがとう