2009-11-10 47 views
19

私は、USBカードから自身を更新できる組み込みLinuxシステムを持っています。インターフェースプログラムはUSB挿入を検出し、アップグレードされた実行可能ファイルを探します。私は現在、ローカルファイルにコピーし、rc5.dにいくつかのコマンドをインストールして、次の起動時に既存のexeファイルにコピーします。それから私はソフトウェアを再起動します。Linuxで実行中の実行ファイルを置き換える

これを行うより良い方法はありますか?

+0

この回答は、これを行う方法を理解するのに役立ちます:http://stackoverflow.com/a/21115731/2706918 –

答えて

8

Linuxでは、プロセスの実行中に実行中の実行可能ファイルを安全に置き換えることができます。プロセスが実行されている限り、そのインスタンスは引き続き「古い」コードを使用します。アプリケーションへの新規呼び出しのたびに「新しい」コードが使用されます。したがって、アプリケーション(または必要に応じてデバイス)を再起動するだけで、新しいコピーが使用されます。

アプリケーションがメモリに常駐していない可能性があるため、設定ファイルまたはライブラリが変更される場合は注意が必要です。この場合、より安全な賭けはあなたが言及したことをスクリプトにさせることです。

+1

重要なポイントは、最初に元のファイルをunlink()する必要があることです(例えば、 'rm'コマンドを使用して)この保証が保持されます。 –

29

次回起動時にファイルをコピーする必要はありません。代わりに、このシーケンスは正常に動作します:

  • 新しい実行ファイルをローカルファイルにコピーします。
  • ローカルファイルを確認してください。
  • unlink()既存の実行可能ファイル。
  • 新しい実行ファイルを正しい名前にrename()します。

アプリケーションはunlink()の後も実行され続けます。実行中のすべてのコピーが終了するまで、カーネルは基礎となるデータを解放しません。

execve()を使って、現在実行中のプロセスを新しくアップロードしたバージョンに置き換えることもできます。

21

それはあなたrm場合、プログラムは、それが最初の(のリンクを解除)を実行中に実行可能ファイルを置き換えるためにOKです。

これはcpの場合と異なりますので、使用しないでください。ファイルmv、または実際には確かにrmと同じ場所に新しいものを入れてください。組み込みソフトウェアのコードでこれを実行している場合は、unlink(2)で始まります。

UNIXカーネルは、inodeがまだ使用中であることを知っていて、ファイルのディレクトリエントリを削除しますが、inode(およびデータブロック)はinode参照カウントがゼロになるまで解放しません。そのインスタンスが実行されている間は発生しません。

これはおそらく組み込みシステムの問題ではありませんが、一般的な注意として、サーバー上の場合を除いて、ネットワークストレージの場合はこれを考慮しないでください。

+0

ネットワーキングがファイルシステム層の下で行われていればOKですが、この技術はiSCSIでも問題ありません。 – DigitalRoss

関連する問題