2012-05-17 17 views
9

Tôi nhận được thông báo này - "Tệp văn bản bận" khi tôi cố gắng thực thi tệp perl trong khi tệp này hiện đang được sử dụng bởi một quy trình khác.Có thể "Tệp văn bản bận" xảy ra khi hai quá trình cố gắng thực thi một tệp perl trong cùng một thời điểm không?

Theo điều này /usr/bin/perl: bad interpreter: Text file busy, sự cố này xảy ra khi tệp perl mở để viết khi tôi cố thực thi nó.

Nhưng quyền của tệp là -r-xr-xr-x. Nó không cung cấp quyền để viết.

Có thể "Tệp văn bản bận" xảy ra khi hai quá trình cố gắng thực thi tệp perl trong cùng một thời điểm không?

+0

(này được cho là nhiều hơn một câu hỏi quản trị hệ thống - nó phụ thuộc vào hệ điều hành ngữ nghĩa cụ thể và không theo bất kỳ cách nào cụ thể cho Perl, hoặc thậm chí là diễn giải ngôn ngữ - vì vậy trong tương lai, Lỗi máy chủ có thể là địa điểm phù hợp hơn) –

+0

tag perl bị xóa – joewhitedelux

Trả lời

10

Không, điều này sẽ không xảy ra đơn giản chỉ vì hai tập lệnh Perl đang thực thi cùng một lúc.

Giải thích có khả năng hơn là bản thân tập lệnh được mở để viết trong khi hệ điều hành đang cố đọc dòng shebang của nó để xác định trình thông dịch sử dụng.

Điều này cũng có thể xảy ra nếu quá trình bên ngoài đang cố nâng cấp hoặc sửa đổi trình thông dịch Perl hoặc một trong các thư viện được chia sẻ tùy thuộc vào. Lưu ý rằng quyền truy cập tệp thường không áp dụng cho các tài khoản superuser, chẳng hạn như root, vì vậy bất kỳ quá trình nào đang chạy như superuser vẫn có thể cố gắng sửa đổi trình thông dịch Perl mặc dù không có số bit +w được đặt.

(Điều đó nói rằng, hầu hết các công cụ nâng cấp hệ điều hành trên hệ điều hành kiểu POSIX sẽ viết phiên bản nâng cấp của tệp nhị phân sang tệp mới trên cùng hệ thống tệp, đóng tệp đó khi hoàn tất và đổi tên nó ban đầu (một hoạt động nguyên tử) - sao cho inode đính kèm tại /usr/bin/perl là bản thân nó không bao giờ mở để viết. Như vậy, trên một hệ thống được xử lý tốt, lỗi mà bạn đang thấy không phải là thứ sẽ xuất hiện trong thực tế) .

Bạn có thể sử dụng lệnh fuser để xem ai có một tập tin mở, hoặc cho kịch bản của bạn hoặc cho người phiên dịch của mình:

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

Cảm ơn sự mở rộng của bạn, Charles. Tệp perl này được thực thi bởi root dưới dạng xem dạng chữ. Sau khi đọc bài đăng của bạn, tôi đoán chế độ xem rõ ràng gây ra sự cố này, liều tệp perl thực tế không cung cấp quyền viết, nhưng tệp ở chế độ xem rõ ràng có thể cung cấp. – joewhitedelux

2

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

Việc cho phép có thể được thiết lập sau khi bạn mở kịch bản cho văn bản, nhưng trước khi tập lệnh được chạy.

Đây là mã ví dụ mà viết một kịch bản perl mới your-script trong thư mục hiện, làm cho nó thực thi trong khi loại bỏ các quyền ghi, và cố gắng để chạy các script perl. Các điều khoản cuối cùng là -r-xr-xr-x nhưng file vẫn mở cho các văn bản đó là lý do tại sao kịch bản tạo ra "Văn bản tập tin bận rộn" lỗi:

#!/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) 
Các vấn đề liên quan