実行ファイルがプロセスで実行されているときに実行ファイルを上書きまたは削除してから再インストールして再作成すると、プロセスは新しい実行ファイルを再実行しますか?
質問に対する答えは次のように異なります。
実行可能ファイルはプロセス内でサービス/デーモンとして実行されますか?
Linux、Unixなどのオペレーティングシステム...?
再インストールはインストーラファイル(Ubuntu、Windowsなど)を介して行われますか、または
deb
ソースコードをビルドすることによって行われますか?msi
ここにいくつかの例があります。
Ubuntuでプロセスが実行可能ファイルを実行し、手動で再インストールしてソースコードの実行可能ファイルを上書きすると、プロセス
configure
はmake
新しいmake install
実行可能ファイルではなく元の実行可能ファイルを実行し続けます。msi
Windwos 10では、プロセスが実行可能ファイルをサービスとして実行するときにインストーラファイルを介して実行可能ファイルを再インストールすると、サービスプロセスが再起動され、新しい実行可能ファイルが実行されると聞きました。 Ubuntu または Debian の .deb ファイルからインストールするとき、同じまたは類似の状況がありますか?
ありがとうございます。
ベストアンサー1
カーネルと実行可能ファイルの種類によって異なります。実行可能ファイルの起動方法やインストール方法に依存しません。
Linuxの場合:
デフォルトの実行可能ファイル(つまり、カーネルで直接実行される機械語コードを含むバイナリファイル)の場合、実行可能ファイルを実行時に変更することはできません。
$ cp /bin/sleep . $ ./sleep 999999 & $ echo >sleep sh: 1: cannot create sleep: Text file busy
実行可能ファイルを削除(つまりリンク解除)し、同じパスに新しい実行可能ファイルを作成できます。ファイルがまだ開いている間に削除される他の状況と同様に、実行可能ファイルを削除しても実行中のプロセスには影響しません。これは削除されません。 。
スクリプト(で始まる
#!
)の場合、プログラムの実行中にスクリプトファイルを変更できます。これがプログラムに影響を与えるかどうかは、インタプリタがスクリプトを読み取る方法によって異なります。実行を開始する前にスクリプト全体を独自のメモリに読み込むと、実行には影響しません。インタプリタが要求時にスクリプトを読み取ると、実行に影響を与える可能性がありますsh
。
他の多くのUnixシステムはこの動作を共有しますが、すべてではありません。 IIRC 以前のバージョンの Solaris では、デフォルトの実行可能ファイルの変更が許可され、競合が発生したことがよくありました。一部のUnixバリアント(HP / UXを含む)は、現在実行中のデフォルトの実行可能ファイルを削除することもできません。
ほとんどのソフトウェアインストーラは、既存のバイナリを上書きするのではなく、新しい実行可能ファイルをインストールする前に既存の実行可能ファイルを削除します。例えば
rm /bin/target
cp target /bin
そしてちょうどcp target /bin
。これがシェルコマンドがinstall
実行するアクションです。ただし、/bin/target
プロセスの実行中に誰かが実行しようとするとプログラムが破損するため、これは理想的ではありません。cp
ファイルを一時的な名前にコピーし、最後の名前に置き換えるのが最善です。ファイル名を変更すると(つまり、同じディレクトリに移動するか、より一般的には同じファイルシステムに移動する)、古いターゲットファイルがある場合は削除されます。dpkg
たとえば、これがうまくいく方法です。
cp target /bin/target.tmp
mv /bin/target.tmp /bin/target