Solution for “/bin/sh: bad interpreter: Text file busy” after moving shell script from Windows to Linux
シェルスクリプトをWindows 7からLinux(Fedora 19)にコピーなどで移動させて,その直後にシェルスクリプトを実行すると以下のエラーメッセージが表示されてしまい実行できなかった。
bash: ./shellscript.sh: /bin/sh: bad interpreter: Text file busy
ファイルをWindowsからLinuxに移動させた直後にだけこのようなエラーが発生しており,20秒ほど待機してから実行すれば問題はない。
待機すれば解決するのだが,WindowsからLinuxにシェルスクリプトをコピーして実行する場合にエラーとなり,困ってしまった。具体的には,複数のシェルスクリプトから構成されるシェルスクリプトで,一緒にコピーしてきた他のシェルスクリプトを実行する際に,このエラーが出てしまい,対策を講じる必要に迫られた。
Answer 1: Fix Samba configuration
原因がよくわからず,調べてみたところ以下のページがみつかった。
どうやらSambaというLinuxからWindowsのファイルサーバーを実装する機能が原因のようだった。Sambaでファイルロックをしているため,他のプロセスからファイルを実行できなかったようだ。
/etc/samba/smb.conf
ファイルに以下の内容を追記し,Sambaを再起動(smbd
コマンドを実行)すれば,ファイルをWindowsからLinuxに移動させても即座に実行できた。
oplocks = no
しかし,この方法では管理者権限で設定ファイルを変更する必要があり,他のマシンで作業する場合に対応できない。
Answer 2: Retry shell script
解決策の一つとしては,ロックが終了するまで待機してから実行するという方法がある。
例えば,以下のように外部シェルスクリプトの実行時に,成功するまで実行を繰り返すことで対応できる。
until ./shellscript.sh 2>/dev/null; do :; done
ただし,以下2点の問題があるのでよくない。
- 無限ループ発生の危険性あり
- ロック解除まで待機が必要
特に,2.の待機が必要なのが,時間ロスがあり無視できない。
Answer 3: Input shell script to sh
別の方法として,実行したいシェルスクリプトをsh
に読み込ませる方法がある。
以下のように,./shellscript.sh
となっている箇所をsh shellscript.sh
に変更する。
sh shellscript.sh
こうすれば,直接シェルスクリプトを実行するのではなく,sh
に読み込ませるので,ファイルがロックされていても問題なく実行できる。
この方法であれば,ファイルロック解除の待機が不要であり,修正も最小限で済む。
今回はこの方法で解決できた。