Technology · 実用ガイド

Linux の「Text file busy」— 実行ファイルを置き換える前に所有者を確認する

ETXTBSY は権限不足ではなく書き込みと実行の衝突です。パスと inode、実行側と書き込み側を記録し、別ファイルを検証してからパス切替と再起動を別々に確認します。

オリジナル技術イラスト: Linux の「Text file busy」— 実行ファイルを置き換える前に所有者を確認する — path and inode evidence
オリジナル技術イラスト: 変更前にパス、実体パス、デバイス、inode、モード、所有者、ダイジェスト、関連プロセスを記録します。 Watch at Ease

Linux の「Text file busy」(ETXTBSY)は、実行中のイメージを書き込み用に開こうとしたか、まだ書き込み用に開かれているファイルを実行しようとした場合に発生します。chmod や無条件の再試行は所有関係を証明しません。

正確なパス、デバイス、inode を保存し、実行プロセスと書き込み可能な記述子を特定します。別の候補を検証して同一ファイルシステム内で一つのパスを切り替えても、既存プロセスは古いイメージを使い続けます。再起動と受入確認は別の工程です。

ETXTBSY を chmod の問題として扱わない

このエラーは書き込みと実行の関係を示し、実行ビット不足を意味しません。失敗したコマンドと errno を保存し、稼働中バイナリへの上書きか、fork で継承された書き込み記述子かを分けます。

メッセージを消すために本番バイナリを削除、強制コピー、連続再試行しないでください。目的が直接書き込み、新規実行、管理された置換のどれかを先に定義します。

パス、inode、二つの所有者を証明する

readlink、stat、file、sha256sum で対象の同一性を記録し、承認済みのプロセス一覧、fuser、lsof で実行者と書き込み者を確認します。同じパスでも rename 後は別 inode を指せます。

systemd、コンテナ、スーパーバイザー、パッケージ管理者などのライフサイクル所有者も記録します。NFS や共有・overlay ストレージは別の境界です。

実行中イメージと書き込み記述子競合を分ける

一方は古いプロセスが inode を実行中の競合です。他方は新しい実行ファイルの書き込み記述子が fork で継承され、execve が書き込み中と判断する競合です。Rust の課題は後者を再現します。

sleep や再試行はタイミングを変えるだけです。記述子所有権と書き込みから実行への引渡しを明示するか、別候補を配備所有者が切り替えます。

別候補を配置し一つのパスを意図的に切り替える

対象ディレクトリまたは同一ファイルシステムの検証場所に候補を書き、ダイジェスト、形式、モード、所有者、必要な署名を確認します。輸送用ハッシュだけで未知のファイルを実行しません。

rename(2) は一つのディレクトリエントリを原子的に置き換え、既存記述子には影響しません。複数ファイル、NFS、ライブラリ、移行を含む配備全体の原子性は別問題です。

再起動、検証、完了判定

切替後も既存プロセスは古い inode を使えます。サービス所有者が再起動し、新 PID、同一性、版、ヘルス、ログ、依存関係を確認します。

元の ETXTBSY が説明され、予期しない書き込み記述子がなく、新規起動が意図した成果物を使い、実際の受入試験が通るまで完了にしません。

オリジナル技術イラスト: Linux の「Text file busy」— 実行ファイルを置き換える前に所有者を確認する — replacement and restart boundary
オリジナル技術イラスト: 切替後は新しい PID、実行ファイルの同一性、版、ヘルス、ログ、ロールバックを確認します。 Watch at Ease