Bầy & exec có an toàn trong bash không?


13

Đoạn mã khóa "tiêu chuẩn" mà tôi đã thấy giống như ...

(
    flock -n 200 || exit 1;
    # do stuff
) 200>program.lock

Có an toàn không (thử nghiệm dường như nói như vậy) để sử dụng exectại thời điểm đó? Liệu quy trình con có giữ được khóa không?

(
    flock -n 200 || exit 1;
    exec /usr/bin/python vendors-notcoolstuff.py
) 200>program.lock

Tôi mơ hồ nhớ các quy trình thực thi giữ lại các mô tả tệp đang mở và vì đàn sử dụng các mô tả tệp nên nó sẽ hoạt động. Nhưng tôi không thể tìm thấy bất kỳ tài liệu nào làm cho nó rõ ràng và rõ ràng.

Đối với hồ sơ, điều này là cụ thể cho Linux.

Câu trả lời:


3

Có, ổ khóa được bảo quản trên exec. Khóa được bảo toàn trong cuộc gọi hệ thống cơ bản execve, miễn là bộ mô tả tệp vẫn mở. Các bộ mô tả tệp vẫn mở trên execvetrừ khi chúng được cấu hình để đóng trên exec và các bộ mô tả tệp được tạo bởi chuyển hướng shell không được đánh dấu là close-on-exec.


6

Vâng, đúng vậy. Exec chỉ thay thế hình ảnh quá trình, nhưng nó vẫn là quá trình tương tự vì vậy các khóa cấp hệ điều hành được liên kết với nó vẫn giữ nguyên.

Rất dễ dàng để xác minh rằng nó hoạt động:

Khóa

(
    flock -n 200 || exit 1;
    echo "locked"
    exec ./script
) 200>program.lock

kịch bản

sleep 100

Hãy thử chạy ./lockhai lần trong vòng 100 giây tiếp theo. Bạn sẽ chỉ nhận được khóa một lần, ergo execkhông phát hành khóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.