Trong linux, điều gì sẽ xảy ra với một chương trình đang chạy khi tệp thực thi của nó đã bị sửa đổi hoặc bị xóa?


12

Giả sử /usr/local/bin/rubyđang chạy trong nền, và sau đó chúng tôi ghi đè lên rubybằng một phiên bản khác hoặc thậm chí xóa ruby.

Điều gì sẽ xảy ra với những người chạy quy trình ruby?

Câu trả lời:


10

Nó phụ thuộc vào chính xác cách thức thực thi được cập nhật. Nếu cùng một tệp được mở và các phần của nó bị thay đổi, điều tồi tệ sẽ xảy ra. Nếu nó bị xóa, tập tin sẽ bị xóa khỏi cấu trúc thư mục của hệ thống tập tin, nhưng thực tế không được liên kết (nghĩa là đã bị xóa) cho đến khi quá trình cuối cùng mở nó đã thực hiện. Vì vậy, nếu thực thi được loại bỏ và một cái mới có cùng tên được viết ở vị trí của nó, cái cũ sẽ tiếp tục hoạt động tốt.


"Nếu cùng một tệp được mở và các phần của nó bị thay đổi" không bằng "nếu tệp thực thi bị xóa và một tệp mới có cùng tên được viết ở vị trí của nó" ?? Ý bạn là mv tập tin mới vào tập tin cũ là xấu nhưng tập tin cũ rm thì tập tin mới vào vị trí tập tin cũ là ok?
jean

4

Họ sẽ tiếp tục đi. Có thể sụp đổ khủng khiếp nếu họ cố gắng truy cập và nhận được một cái gì đó hoàn toàn sai. Tôi sẽ không làm điều đó trừ khi tôi phải :)


Vâng. Tôi tự cập nhật phần mềm mọi lúc trong khi tập lệnh đang chạy.
John T

1
Đối với các tập lệnh, điều quan trọng là phải có các đối tượng thực tế gần đây hoạt động với bộ mô tả tệp được mở ban đầu. Trong trường hợp này là tốt miễn là bạn thay thế tệp và không thay đổi nó. Đối với các tệp nhị phân, chúng thường hoạt động trên FD được ánh xạ nội bộ nên không có vấn đề gì (trừ khi bạn sửa đổi các tệp). Nhưng có thể có các ứng dụng mở tên tệp để kiểm tra và điều đó có thể có rủi ro (tuy nhiên tôi không thể đưa ra bất kỳ ví dụ tiêu cực nào). Hầu hết các bản phân phối / quản lý gói linux hoạt động theo giả định rằng việc thay thế các tệp nhị phân và thư viện (trong thời gian giới hạn) là tốt.
eckes

1

Điều gì sẽ xảy ra với những người chạy quy trình ruby?

  1. tạo một bản sao của / usr / local / bin / ruby
  2. [nếu nó không chạy, hãy chạy / usr / local / bin / ruby]
  3. thử: rm / usr / local / bin / ruby
  4. và xem cho chính mình :)

1

Theo hiểu biết của tôi, hạt nhân Linux có một thành phần được gọi là trình tải mở chính tệp thực thi, chứa hình ảnh, trong quá trình tải / liên kết và sau khi thực hiện liên kết với các thư viện, v.v., trình tải sẽ đóng tệp. Do đó, quá trình này xảy ra và hoàn thành vào thời điểm kernel thực sự khởi chạy tiến trình.

Tôi không chắc liệu tệp thực thi gốc trên đĩa có cần được tham chiếu hay không nếu tệp thực thi sau này cố gắng nhập các thư viện bên ngoài.

Tôi có thể nói, và đó là kinh nghiệm của tôi rằng, nếu bạn xóa tệp thực thi trên đĩa, thì tệp thực thi được tải trong bộ nhớ sẽ không bị ảnh hưởng. Tương tự, nếu tệp thực thi được thay thế bằng phiên bản mới hơn, thì hiện tại tệp thực thi không được "tự động" cập nhật trừ khi chúng bị tạm dừng và khởi chạy lại.

Tôi gặp vấn đề với bộ điều khiển RAID khiến toàn bộ đĩa mà thư mục gốc và các phân vùng khác được gắn vào đột nhiên hoạt động như thể nó bị ngắt kết nối. Không thể tải các chương trình mới, nhưng các chương trình trong bộ nhớ vẫn hoạt động tốt, cho đến khi chúng cần các tệp từ đĩa.


Điều đó không có vẻ rất hiệu quả. Tôi nghĩ rằng Windows sẽ lập bản đồ bộ nhớ thay thế, vì vậy các trang được tải theo yêu cầu.
sashoalm
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.