프로그램 업데이트에 관한 질문입니다.
글쓴이: lovejin0309 / 작성시간: 화, 2006/05/09 - 11:43오전
프로그램을 원격에서 업데이트하는 것에 대한 질문입니다.
현재 APP01이 실행중인 상태에서 APP01을 업데이트 하려고 한다면
APP01을 종료시킨후 업데이트를 하는 방법밖에 없나요?
APP01이 실행중인 상태에서 파일을 받은후 APP01을 종료후 다시 시작하는 방법은 사용할 수 없을까요?
Forums:
리눅스에서는
리눅스에서는 실행중인 파일을 고치거나 지울 수 있습니다.
윈도우에서는 실행중인 파일을 건드릴 수 없습니다. 그래서 실제 실행 파일 앞에서 런처가 업데이트를 실시하고 실행 파일을 이름을 바꾸거나 하는 핵을 사용하죠.
May the F/OSS be with you..
----------------------------
May the F/OSS be with you..
테스트를 해
테스트를 해 보았습니다.
[root@host application ]$ ps
.
.
.
.
.
.
.
.
143 4,64 00:00:00 APP01
[root@host application ]$ cp ../APP01 ./
위와 같이 하면 다음과 같이 뜹니다.
cp: cannot creat regular file './APP01': Text file busy
위와 같은 문제점을 어떻게 해결할 수 있을까요?
리눅스 옛날버전과 약간 다릅니다.
hey님이 쓰신 것중 수정에 대한 것은 2.2이나 2.4 초창기까지 유효한것 같습니다.
text가 busy하다고 나오는 것은 수행하는 코드의 바이너리 이미지가 memory mapped IO 형태로 되어 있기 때문입니다. 좀더 정확히는 바이너리 이미지가 들어 있는 inode가 memory map되어 있는 것인데요.
cp로 명령으로 바이너리를 교체하면 inode가 유지되므로 불가능하지만 mv 명령으로 바이너리를 교체하면 inode가 바뀌므로 memory map이 유지되면서 교체 가능합니다. 프로그램이 실행중이라면, 이전 inode의 데이터는 파일시스템에서는 사라지지만 공간은 차지하고 있는 파일이 됩니다.
more /proc/PID/maps 로 확인해보시면 경로 앞의 inode 값을 확인해 볼 수 있습니다.
또한 ls -ial 로 파일 시스템상의 inode도 확인해 볼 수 있습니다.
리눅스 과거 버전은 실행 바이너리에 대해서 memory map을 안시켜놓은 듯합니다. 그시절에 확인을 안해봐서..;)
---
http://coolengineer.com
아이쿠
부끄러워 //_//
May the F/OSS be with you..
----------------------------
May the F/OSS be with you..
댓글 달기