アップグレード後もソフトウェアパッケージがまだ正常に動作するのはなぜですか?

アップグレード後もソフトウェアパッケージがまだ正常に動作するのはなぜですか?

ソフトウェアの一部を実行していて、パッケージマネージャを実行してソフトウェアをアップグレードしましたが、Linuxがパッケージアップグレードの実行プロセスを停止せずにまだ正常に実行されていることを確認したとします。 Linuxはこれをどのように実行しますか?

答え1

その理由は、Unixは実行中に実行ファイルをロックしないか、Linuxが好きでもファイル名ではなくiノードにロックが適用されるからだ。つまり、ファイルが削除され(実際にはリンクされていない)、同じ名前の新しいファイルに置き換えられても、開いているプロセスは同じ(以前の)データにアクセスできます。これはデフォルトでパッケージ更新が実行することです。

これがUnixとWindowsの主な違いの1つです。後者はファイル名とinodeの間にレイヤーがないため、ロックされたファイルを更新できません。このため、完全な再起動が必要な場合が多いため、特定のパッケージを更新またはインストールするのは面倒です。

答え2

実行ファイルは通常一度開かれ、ファイル記述子に添付され、単一の実行中に再び開くバイナリファイルにはファイル記述子がありません。たとえば、これを行うと、ファイル記述子は通常呼び出されたbashときに一度exec()指すinodeに対してのみ生成されます。/bin/bash

これは通常、実行中に自分自身を再読み込みしようとしない単純なバイナリの場合(呼び出したパスを使用して)、キャッシュされたコンテンツがぶら下がっているinodeで有効なままであることを意味します。これは、デフォルトでは以前のバージョンの実行可能ファイルのコピーがあることを意味します。

より複雑な場合、問題が発生する可能性があります。たとえば、構成ファイルが更新された後に再度読み取られたり、プログラムが実行パスを介して独自に再実行されることがあります。プログラムが相互接続されているため、1つはアップグレード前に実行され、もう1つはアップグレード後に実行されても問題が発生する可能性があります(おそらく最初のプログラムによって)。一部の図書館も同じだ。

ただし、簡単なユースケースでは、プロセスを再起動せずに安全にアップグレードできます。

関連情報