리눅스에서 실행 파일이 수정되거나 삭제되면 실행중인 프로그램은 어떻게됩니까?


12

/usr/local/bin/ruby백그라운드에서 실행 중이라고 가정 ruby하고 다른 버전으로 덮어 쓰거나 심지어 삭제하십시오 ruby.

루비 프로세스를 실행하는 사람들은 어떻게됩니까?

답변:


10

실행 파일이 정확히 어떻게 업데이트되는지에 달려 있습니다. 동일한 파일을 열고 파일의 일부를 변경하면 나쁜 일이 발생합니다. 파일이 제거되면 파일은 파일 시스템의 디렉토리 구조에서 제거되지만 마지막으로 열린 프로세스가 실행될 때까지 실제로 연결 해제 (삭제)되지 않습니다. 따라서 실행 파일이 제거되고 동일한 이름의 새 실행 파일이 대신 사용되면 이전 파일은 계속 정상적으로 작동해야합니다.


"같은 파일을 열고 파일의 일부를 변경 한 경우"는 "실행 파일이 제거되고 동일한 이름의 새 파일이 그 자리에 기록 된 경우"와 같지 않습니다. mv new file to old file은 좋지만 rm old file 그런 다음 cp new file to old file location은 괜찮습니까?
Jean

4

그들은 계속 갈 것입니다. 그들이 스스로 접근하려고 시도하고 완전히 잘못된 것을 받으면 끔찍하게 충돌 할 수 있습니다. 내가하지 않으면하지 않을 것이다 :)


네. 스크립트가 실행되는 동안 항상 소프트웨어를 수동으로 업데이트합니다.
John T

1
스크립트의 경우 처음에 열린 파일 설명자와 함께 작동하는 실제 최근 통역사가 있어야합니다. 이 경우 파일을 바꾸고 변경하지 않는 한 괜찮습니다. 바이너리의 경우 일반적으로 초기 매핑 된 FD에서 작동하므로 파일을 수정하지 않는 한 문제가 없습니다. 그러나 검사를 위해 파일 이름을 여는 응용 프로그램이있을 수 있으며 위험 할 수 있습니다 (그러나 부정적인 예를 줄 수는 없습니다). 대부분의 리눅스 배포판 / 패키지 관리자는 바이너리와 라이브러리를 (제한된 시간 동안) 교체하는 것이 좋다고 가정합니다.
eckes

1

루비 프로세스를 실행하는 사람들은 어떻게됩니까?

  1. / usr / local / bin / ruby의 사본을 만드십시오
  2. [실행 중이 아니면 / usr / local / bin / ruby를 실행하십시오]
  3. 시도 : rm / usr / local / bin / ruby
  4. 자신을 참조하십시오 :)

1

Linux 커널에는 로더라는 구성 요소가 있으며로드 / 링크 프로세스 중에 이미지를 포함하고 실행 파일 자체를 여는 라이브러리라는 구성 요소가 라이브러리에 대한 링크 등으로 완료되면 로더가 파일을 닫습니다. 따라서이 프로세스는 커널이 실제로 프로세스를 시작하는 시점에 이루어지고 완료됩니다.

나중에 실행 파일이 외부 라이브러리를 가져 오려고 할 때 디스크의 원래 실행 파일을 참조해야하는지 잘 모르겠습니다.

디스크에서 실행 파일을 삭제해도 메모리에로드 된 실행 파일에는 영향을 미치지 않는 것이 제 경험입니다. 마찬가지로, 실행 파일이 최신 버전으로 바뀌면 현재 실행중인 파일은 중지되고 다시 시작되지 않는 한 "자동"으로 업데이트되지 않습니다.

루트 디렉토리와 다른 파티션이 마운트 된 전체 디스크가 연결이 끊어진 것처럼 갑자기 작동하게하는 RAID 컨트롤러에 문제가있었습니다. 새 프로그램을로드 할 수 없지만 디스크의 파일이 필요할 때까지 메모리에있는 프로그램이 제대로 작동했습니다.


그것은 매우 효율적으로 들리지 않습니다. 필자는 Windows가 대신 메모리를 매핑하여 페이지가 필요할 때로 드된다고 생각합니다.
sashoalm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.