2009-11-10 6 views
19

나는 USB 카드에서 스스로 업데이트 할 수있는 임베디드 리눅스 시스템을 가지고있다. 인터페이스 프로그램은 USB 삽입을 감지하고 업그레이드 된 실행 파일을 찾습니다. 나는 현재 로컬 파일에 복사하고 rc5.d에 다음 부팅시 기존 exe 파일을 복사하는 몇 가지 명령을 설치합니다. 그런 다음 소프트웨어를 재부팅합니다.리눅스에서 실행중인 실행 파일 바꾸기

더 좋은 방법이 있나요?

+0

이 대답은 당신이 이것을하는 방법을 이해하는 데 도움이 될 것입니다 : http://stackoverflow.com/a/21115731/2706918 –

답변

8

리눅스에서는 프로세스가 실행되는 동안 실행중인 실행 파일을 안전하게 바꿀 수 있습니다. 프로세스가 실행되는 동안 해당 인스턴스는 "이전"코드를 계속 사용합니다. 응용 프로그램에 대한 모든 새 호출은 "새"코드를 사용합니다. 따라서 응용 프로그램 (또는 필요한 경우 장치)을 다시 시작하면 새 사본이 사용됩니다.

메모리에 상주 할 수없는 응용 프로그램이 설정 파일이나 라이브러리를 변경하는 경우주의해야합니다. 이 경우, 더 안전한 내기는 언급 한대로 스크립트를 실행하는 것입니다.

+1

언급 중요한 포인트는'unlink()'해야 할 필요가 원래 파일 (예를 들어,'rm' 명령을 사용하여)이 보증이 유지됩니다. –

29

다음에 부팅 할 때 파일을 복사하지 않아도됩니다. 대신,이 순서는 잘 작동합니다 :

  • 로컬 파일에 새로운 실행 파일을 복사하십시오.
  • 로컬 파일을 확인하십시오.
  • unlink() 기존 실행 파일.
  • 새로운 실행 파일을 올바른 이름으로 rename()하십시오.

응용 프로그램은 unlink() 이후 계속 실행됩니다. 커널은 실행중인 모든 복사본이 완료 될 때까지 기본 데이터를 해제하지 않습니다.

execve()을 사용하여 현재 실행중인 프로세스를 새로 업로드 한 버전으로 대체 할 수도 있습니다.

21

그것은 당신이 rm ( 연결을 해제) 경우 프로그램이 을 실행하는 동안 먼저 실행 파일을 대체하기 위해 OK입니다.

이것은 cp과 관련이 없으므로 사용하지 마십시오. mv 파일 또는 실제로 확실하게하려면 rm과 같은 위치에 새 것을 넣으십시오. 임베디드 소프트웨어의 코드로이 작업을 수행하는 경우, unlink(2)으로 시작할 수 있습니다.

유닉스 커널은 inode가 여전히 사용 중임을 알고 파일의 디렉토리 항목을 제거하지만 inode 참조 횟수가 0이 될 때까지는 inode (및 데이터 블록)를 해제하지 않으며 그 결과도 얻지 않습니다 인스턴스가 실행되는 동안 발생하지 않습니다.

이것은 임베디드 시스템에서는 문제가되지 않지만 일반적으로 서버 자체를 제외하고는 네트워크로 연결된 저장소에서 작동하지 않습니다.

+0

네트워킹이 파일 시스템 계층 아래에서 이루어지면 OK라고 덧붙여 야합니다. 그래서이 기술은 iSCSI에서도 괜찮을 것입니다. – DigitalRoss

관련 문제