9

このファイルが現在別のプロセスで使用されているときに perl ファイルを実行しようとすると、「テキスト ファイルがビジーです」というメッセージが表示されました。

この/usr/bin/perl: bad interpreter: Text file busyによると、この問題は、perl ファイルを実行しようとしたときに書き込み用に開いているときに発生します。

ただし、ファイルのパーミッションは -r-xr-xr-x です。書き込み権限はありません。

2 つのプロセスが同時に perl ファイルを実行しようとすると、「テキスト ファイルがビジー」になることがありますか?

4

2 に答える 2

11

いいえ、2 つの Perl スクリプトが同時に実行されているという理由だけで、これは起こりません。

より可能性の高い説明は、オペレーティングシステムが使用するインタープリターを決定するためにシバン行を読み取ろうとしている間、スクリプト自体が書き込み用に開かれているということです。

これは、外部プロセスが Perl インタープリター自体、または依存する共有ライブラリーの 1 つをアップグレードまたは変更しようとしている場合にも発生する可能性があります。通常、ファイル許可は root などのスーパーユーザー アカウントには適用されないため、スーパーユーザーとして実行されているプロセスは、+wビットが設定されていなくても Perl インタープリターを変更しようとする可能性があることに注意してください。

(とは言っても、POSIX スタイルのオペレーティング システムで動作するオペレーティング システム アップグレード ツールのほとんどは、アップグレードされたバージョンのバイナリを同じファイル システムの新しいファイルに書き込み、完了したらそのファイルを閉じ、元のファイルに名前を変更します (アトミックな操作) -- でアタッチされた inode/usr/bin/perl自体が書き込み用に開かれないように. そのため、行儀の良いシステムでは、表示されているエラーは実際には発生しないものです)。

このfuserコマンドを使用して、スクリプトまたはそのインタープリターのファイルを開いているユーザーを確認できます。

$ sudo fuser /usr/bin/perl -uv
                     USER        PID ACCESS COMMAND
/usr/bin/perl:       root      16579 f.... (root)python
于 2012-05-17T15:11:26.847 に答える
2

ただし、ファイルのパーミッションは -r-xr-xr-x です。書き込み権限はありません。

アクセス許可は、書き込み用にスクリプトを開いた後、スクリプトを実行する前に設定できます。

your-script現在のディレクトリに新しい perl スクリプトを書き込み、書き込み権限を削除して実行可能にし、perl スクリプトを実行しようとするコード例を次に示します。最終的なアクセス許可は-r-xr-xr-xありますが、ファイルはまだ書き込み用に開かれているため、スクリプトは「テキスト ファイルがビジーです」というエラーを生成します。

#!/usr/bin/env python3
import os
import stat
import subprocess

file = open('./your-script', 'w') # specify full path
try:
    file.write("#!/usr/bin/perl\nprint 'unreachable';") 
    file.flush() # make sure the content is sent to OS
    os.chmod(file.name, 0o555) # make executable
    print(stat.filemode(os.stat(file.name).st_mode)) # -r-xr-xr-x
    subprocess.call(file.name) # run it
except Exception as e:
    print(e)
finally:
    os.remove(file.name)
于 2014-03-15T06:14:58.843 に答える