f

2017-04-16

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

原因がよくわからず,調べてみたところ以下のページがみつかった。

- Light Material -: Text file busy: exec of.

どうやら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点の問題があるのでよくない。

  1. 無限ループ発生の危険性あり
  2. ロック解除まで待機が必要

特に,2.の待機が必要なのが,時間ロスがあり無視できない。

Answer 3: Input shell script to sh

別の方法として,実行したいシェルスクリプトをshに読み込ませる方法がある。

以下のように,./shellscript.shとなっている箇所をsh shellscript.shに変更する。

sh shellscript.sh

こうすれば,直接シェルスクリプトを実行するのではなく,shに読み込ませるので,ファイルがロックされていても問題なく実行できる。

この方法であれば,ファイルロック解除の待機が不要であり,修正も最小限で済む。

今回はこの方法で解決できた。

0 件のコメント:

コメントを投稿