直接変更できない既存のサービスがあります。プライベートソースであるか編集するのが複雑すぎるか自動的に更新されるため、自分で編集するのに良いターゲットではないとします。
Dockerコンテナできちんと実行したいので、サービスと一緒に暮らして死ぬ必要がある別のフォアグラウンドプロセスが必要です。つまり、開始プロセスがサービスを開始する必要があり、サービスが終了(クラッシュ)した場合は、ルートプロセスも開始する必要があります。 quit 、 Docker コンテナが終了します。
これを行うための良いパターンや既存のツールはありますか?理想的には、サービスのstdout / stderrを独自のstdout / stderrにリダイレクトします。
サービスには一般的な初期化スクリプトがあり、を通じて起動されます/etc/init.d/myservice start
。
私がよく見るのは、コンテナがサービスを開始し、tail -n0 -F
それをいくつかのコアログファイルで使用することです。これはコンテナに一種の標準出力を提供しますが、サービスがクラッシュした場合、コンテナは静かになり、実行を継続し、何も出力しません。より良い方法があるでしょうか?
これについて考える例は次のとおりですsvnserve
。実際には--daemon --foreground
正式にはデバッグ専用のオプションがありますが、うまくいきます。しかし、存在しない場合はどうでしょうか?
ベストアンサー1
バイナリが動的にリンクされている場合は、次のことができます。LD_PRELOAD
最初の呼び出しでフラグを設定する以外は何もしないラッパーでありfork
、後続の呼び出しではフラグを確認して正常に動作します。
バイナリが静的にリンクされている場合は、次のことができます。道最初のfork
通話までその通話をスキップして追跡を停止します。
Linuxでは、専用環境でデーモンを実行できます。PID名前空間単に名前空間からPID 1として監視スクリプトとデーモンを実行します。デーモンが終了すると、名前空間のPID 1(つまり監視スクリプト)がSIGCLDを受け取ります。