2012-05-17 1 views
9

이 파일이 현재 다른 프로세스에서 사용되고있는 동안 perl 파일을 실행하려고하면 "텍스트 파일 사용 중"이라는 메시지가 나타납니다.두 프로세스가 동시에 perl 파일을 실행하려고하면 "Text file busy"가 발생할 수 있습니까?

/usr/bin/perl: bad interpreter: Text file busy에 따르면이 문제는 실행을 시도 할 때 perl 파일이 쓰기 용으로 열려있을 때 발생합니다.

그러나 파일의 권한은 -r-xr-xr-x입니다. 쓰기 권한을 제공하지 않습니다.

두 프로세스가 동시에 perl 파일을 실행하려고 할 때 "텍스트 파일 사용 중"이 발생할 수 있습니까?

+0

(이것은 시스템 관리 문제의 거의 틀림없이 더를 - 그것은 OS에 따라 달라집니다 특정 의미론을 가지며 Perl이나 해석 언어와 관련이 없습니다. 서버 장애가 더 적절한 장소 일 수 있습니다. –

+0

태그 perl이 삭제되었습니다. – joewhitedelux

답변

10

아니요, 두 개의 Perl 스크립트가 동시에 실행 중이기 때문에 발생하지 않습니다.

더 많은 설명은 운영 체제가 사용하려는 인터프리터를 결정하기 위해 셰번 라인을 읽으려는 동안 스크립트 자체가 쓰기 위해 열려 있다는 것입니다.

이것은 외부 프로세스가 Perl 인터프리터 자체 또는 그것이 의존하는 공유 라이브러리 중 하나를 업그레이드 또는 수정하려고하는 경우에도 발생할 수 있습니다. 파일 사용 권한은 일반적으로 루트와 같은 수퍼 유저 계정에는 적용되지 않으므로 수퍼 유저로 실행중인 모든 프로세스는 +w 비트가 설정되어 있지 않아도 Perl 인터프리터를 수정할 수 있습니다.

(즉, POSIX 스타일의 운영 체제에서 가장 잘 작동하는 운영 체제 업그레이드 도구는 업그레이드 된 버전의 이진 파일을 동일한 파일 시스템의 새 파일에 쓰고 완료되면 해당 파일을 닫은 다음이 파일의 이름을 원래의 (원자 적 연산) - /usr/bin/perl에 붙어있는 inode는 쓰기 위해 결코 열리지 않습니다. 따라서, 잘 작동하는 시스템에서 여러분이보고있는 오류는 실제로 일어나지 않아야합니다) .

당신은 당신의 스크립트 또는 통역 중, 열린 파일이있는 사용자를 확인하기 위해 fuser 명령을 사용할 수 있습니다 : 당신이 작성하기위한 스크립트를 연 후

$ sudo fuser /usr/bin/perl -uv 
        USER  PID ACCESS COMMAND 
/usr/bin/perl:  root  16579 f.... (root)python 
+0

확장에 감사드립니다, Charles. 이 perl 파일은 clearcase 뷰 아래에서 루트에 의해 실행됩니다. 귀하의 게시물을 읽은 후, 나는이 문제를 일으키는 클리어 케이스보기를 추측하지만 실제 펄 파일은 쓰기 권한을 제공하지 않지만 클리어 케이스보기의 파일은 제공 할 수 있습니다. – joewhitedelux

2

But the file's permission is -r-xr-xr-x. It does not provide permissions to write.

사용 권한이 설정 될 수 있지만, 스크립트가 실행되기 전에

새로운 Perl 스크립트 your-script을 현재 디렉터리에 쓰고 쓰기 권한을 제거하는 동안 실행 가능하게 만들고 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) 
관련 문제