나는 USB 카드에서 스스로 업데이트 할 수있는 임베디드 리눅스 시스템을 가지고있다. 인터페이스 프로그램은 USB 삽입을 감지하고 업그레이드 된 실행 파일을 찾습니다. 나는 현재 로컬 파일에 복사하고 rc5.d에 다음 부팅시 기존 exe 파일을 복사하는 몇 가지 명령을 설치합니다. 그런 다음 소프트웨어를 재부팅합니다.리눅스에서 실행중인 실행 파일 바꾸기
더 좋은 방법이 있나요?
나는 USB 카드에서 스스로 업데이트 할 수있는 임베디드 리눅스 시스템을 가지고있다. 인터페이스 프로그램은 USB 삽입을 감지하고 업그레이드 된 실행 파일을 찾습니다. 나는 현재 로컬 파일에 복사하고 rc5.d에 다음 부팅시 기존 exe 파일을 복사하는 몇 가지 명령을 설치합니다. 그런 다음 소프트웨어를 재부팅합니다.리눅스에서 실행중인 실행 파일 바꾸기
더 좋은 방법이 있나요?
리눅스에서는 프로세스가 실행되는 동안 실행중인 실행 파일을 안전하게 바꿀 수 있습니다. 프로세스가 실행되는 동안 해당 인스턴스는 "이전"코드를 계속 사용합니다. 응용 프로그램에 대한 모든 새 호출은 "새"코드를 사용합니다. 따라서 응용 프로그램 (또는 필요한 경우 장치)을 다시 시작하면 새 사본이 사용됩니다.
메모리에 상주 할 수없는 응용 프로그램이 설정 파일이나 라이브러리를 변경하는 경우주의해야합니다. 이 경우, 더 안전한 내기는 언급 한대로 스크립트를 실행하는 것입니다.
언급 중요한 포인트는'unlink()'해야 할 필요가 원래 파일 (예를 들어,'rm' 명령을 사용하여)이 보증이 유지됩니다. –
다음에 부팅 할 때 파일을 복사하지 않아도됩니다. 대신,이 순서는 잘 작동합니다 :
응용 프로그램은 unlink()
이후 계속 실행됩니다. 커널은 실행중인 모든 복사본이 완료 될 때까지 기본 데이터를 해제하지 않습니다.
execve()
을 사용하여 현재 실행중인 프로세스를 새로 업로드 한 버전으로 대체 할 수도 있습니다.
그것은 당신이 rm
(이 연결을 해제) 경우 프로그램이 을 실행하는 동안 먼저 실행 파일을 대체하기 위해 OK입니다.
이것은 cp
과 관련이 없으므로 사용하지 마십시오. mv
파일 또는 실제로 확실하게하려면 rm
과 같은 위치에 새 것을 넣으십시오. 임베디드 소프트웨어의 코드로이 작업을 수행하는 경우, unlink(2)
으로 시작할 수 있습니다.
유닉스 커널은 inode가 여전히 사용 중임을 알고 파일의 디렉토리 항목을 제거하지만 inode 참조 횟수가 0이 될 때까지는 inode (및 데이터 블록)를 해제하지 않으며 그 결과도 얻지 않습니다 인스턴스가 실행되는 동안 발생하지 않습니다.
이것은 임베디드 시스템에서는 문제가되지 않지만 일반적으로 서버 자체를 제외하고는 네트워크로 연결된 저장소에서 작동하지 않습니다.
네트워킹이 파일 시스템 계층 아래에서 이루어지면 OK라고 덧붙여 야합니다. 그래서이 기술은 iSCSI에서도 괜찮을 것입니다. – DigitalRoss
이 대답은 당신이 이것을하는 방법을 이해하는 데 도움이 될 것입니다 : http://stackoverflow.com/a/21115731/2706918 –