web-dev-qa-db-ja.com

クラッシュせずに共有ライブラリをアップグレードするにはどうすればよいですか?

ここ 実行可能ファイルを書き換えることができ、プロセスは正常に実行されると表示されます-プロセスが再起動すると、再度読み込まれます。

ただし、プロセスの実行中に(scpを使用して、devからテストサーバーに)バイナリファイルを置き換えようとすると、「file busy」と表示されます。また、共有ライブラリファイル(* .so)を置き換えると、それをリンクするすべてのプロセスがクラッシュします。

なんでそうなの?何か不足していますか?プロセスを停止/クラッシュせずにバイナリファイルを置き換えるにはどうすればよいですか?

19
Sam

Rpmアップグレードでも同じことが行われます-何もクラッシュしないうちにバイナリとライブラリを実行します。

だから違いは何ですか:

  1. ファイルのリンクを解除
  2. 同じ名前で新しいファイルを書き込む

これにより、ファイルが置き換えられることはありません。使用中のバイナリを参照しているiノードは、開いたままの最後のオブジェクトが終了するまで「ビジー」のままです。新しいファイルは、新しいiノード番号で作成されます。

ここでscpまたはcpは、ファイルをインプレースで置き換えようとします。これにより、iノードが参照しているコンテンツが変更されます。これは機能しません-あなたが説明したように。

5
Nils