Linuxでは、実行ファイルが変更または削除された場合、実行中のプログラムはどうなりますか?


12

レッツ・発言は、/usr/local/bin/rubyバックグラウンドで実行され、その後、我々は上書きruby削除しても異なるバージョンで、またはruby

rubyプロセスを実行しているものはどうなりますか?

回答:


10

実行可能ファイルがどのように更新されるかによって異なります。同じファイルが開かれ、その一部が変更されると、悪いことが起こります。削除された場合、ファイルはファイルシステムのディレクトリ構造から削除されますが、ファイルを開いている最後のプロセスが実行を終了するまで、実際にはリンク解除(削除)されません。したがって、実行可能ファイルが削除され、同じ名前の新しい実行可能ファイルがその場所に書き込まれた場合、古いものは問題なく動作し続けるはずです。


「同じファイルが開かれ、その一部が変更された場合」は、「実行可能ファイルが削除され、その場所に同じ名前の新しいファイルが作成された場合」とは異なります。古いファイルへのmv新しいファイルは不良ですが、rm古いファイルでcp新しいファイルから古いファイルの場所へのokですか?
ジャン

4

彼らは続行します。彼らが自分自身にアクセスして完全に間違ったものを受け取った場合、恐ろしくクラッシュするかもしれません。私がしなければならないと私はそれをしません:)


うん。スクリプトの実行中は常に手動でソフトウェアを更新しています。
John T

1
スクリプトの場合、最初に開かれたファイル記述子で動作する最近の実際のインタプリタを持つことが重要です。この場合、ファイルを置き換えて変更しない限り問題ありません。バイナリの場合、通常は最初にマップされたFDで動作するため、問題はありません(ファイルを変更しない限り)。しかし、検査のためにファイル名を開くアプリケーションがあり、それは危険かもしれません(ただし、否定的な例を示すことはできません)。ほとんどのLinuxディストリビューション/パッケージマネージャーは、バイナリーとライブラリー(限られた時間内)の置き換えで問題ないと想定して動作します。
eckes 2017

1

rubyプロセスを実行しているものはどうなりますか?

  1. / usr / local / bin / ruby​​のコピーを作成します
  2. [実行されていない場合は、/ usr / local / bin / ruby​​を実行します]
  3. 試してください:rm / usr / local / bin / ruby
  4. そしてあなた自身のために見てください:)

1

Linuxカーネルには、ロード/リンクプロセス中にイメージを含む実行可能ファイル自体を開き、ライブラリなどへのリンクが完了すると、ローダーがファイルを閉じるローダーと呼ばれるコンポーネントがあることを理解しています。したがって、このプロセスが発生し、カーネルが実際にプロセスを起動するまでに完了します。

実行可能ファイルが後で外部ライブラリをインポートしようとする場合、ディスク上の元の実行可能ファイルを参照する必要があるかどうかはわかりません。

私が言うには、ディスク上の実行可能ファイルを削除しても、メモリに読み込まれた実行可能ファイルは影響を受けないというのが私の経験です。同様に、実行可能ファイルが新しいバージョンに置き換えられた場合、現在実行中のファイルは、停止して再起動しない限り、「自動的に」更新されません。

RAIDコントローラーに問題があり、ルートディレクトリと他のパーティションがマウントされているディスク全体が突然切断されたかのように動作しました。新しいプログラムをロードできませんでしたが、ディスク内のファイルが必要になるまで、メモリ内のプログラムは問題なく動作していました。


それは非常に効率的に聞こえません。Windowsが代わりにメモリマップするので、必要に応じてページが読み込まれると思います。
sashoalm 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.