
긴 계산을 수행하는 프로세스(예: 며칠 동안 실행됨)가 있고 디스크를 임시 저장소로 사용하여 중간 결과를 저장한다고 가정해 보겠습니다(예: 에 마운트되었으며 로 /mnt
교체하려고 함 ). 해당 프로세스를 종료하지 않고 너무 많이 방해하지 않고 해당 디스크를 다른 디스크로 교체하려면 어떻게 해야 합니까?/dev/sda1
/dev/sdb1
그것은 특정 프로그램에 대해 생각하지 않는 일반적인 질문입니다. 최신 버전의 Linux를 실행한다고 가정해 보겠습니다.
답변1
프로세스가 임시 파일을 생성하고 삭제하기 위해 일부 디렉터리를 사용하는 경우 명령을 사용하여 프로세스를 중지 kill -STOP $pid
하고 /proc/$pid/fd에서 열린 파일 설명자를 살펴볼 수 있습니다.
열린 파일이 없으면 마운트 위치를 안전하게 변경하고 해당 파일을 복사한 후 kill -CONT $pid
.
아직 열려 있는 파일이 있거나 프로세스가 파일을 닫지 않으면 GDB를 사용하여 파일 설명자를 마이그레이션해 볼 수 있습니다. 직접 시도해 보았는데 효과가 있었지만 그렇게 할 수 있는 스크립트를 찾았습니다.http://ingvar.blog.redpill-linpro.com/2010/07/10/changing-a-process-file-descriptor-on-the-fly/
프로세스가 네트워크를 통해 통신하는 경우 주의하세요. 중지하면 연결 시간이 초과될 수 있으므로 최대한 빨리 수행해야 합니다(아마도 이전에 더미 프로세스에서 명령 시퀀스를 테스트하고 배치로 실행함).
나는 그것이 효과가 있을 것이라고 생각하지만 오히려 그렇게 할 것이다.추천하지 않는다프로덕션 환경에서 수행해야 합니다.
편집: /proc/$pid/fd에서 열린 네트워크 소켓을 볼 수 있으므로 프로세스가 네트워크를 사용하고 있는지 여부를 확인할 수 있습니다.
답변2
이는 임시 저장소를 사용할 때 프로세스의 동작에 전적으로 달려 있습니다.
프로세스가 에서 파일을 열어 둔 경우 /mnt
장치를 강제로 마운트 해제하더라도 정의되지 않은 방식으로 프로세스가 실패할 가능성이 높지 않고 장치를 교체할 수 없습니다. 프로세스는 일반적으로 열려 있는 파일이 있는 장치가 사라질 것이라고 예상하지 않습니다.
프로세스가 에서 파일을 열고 쓴 다음 닫는 경우 해당 /mnt
프로세스를 중지하고 마운트 해제 및 다시 마운트한 후 다시 시작할 수 있습니다 /mnt
. 이는 를 사용하지 않는 동안 프로세스를 중지할 수 있는지 여부에 따라 다릅니다 /mnt
. 그래서 당신은 할 수
$ kill -STOP pid
$ lsof -p pid | grep /mnt
... then, if it has nothing open on /mnt ...
$ sudo umount /mnt
$ sudo mount /dev/sdb1 /mnt
$ kill -CONT pid
에 열려 있는 파일이 없는 상태에서 프로세스를 중지하더라도 이는 반드시 작동하지 않습니다. 변경하지 않는 /mnt
데 의존하는 일부 논리를 중단했을 수 있기 때문입니다 . /mnt
같은 것
/mnt/wibble
존재 하는지 확인- 그렇습니다! 열어서 읽을 준비를 합시다.
- ...프로세스가 중지되고 다른 장치가 마운트됩니다
/mnt
... - ...프로세스가 다시 시작됩니다...
- 안 돼!
/mnt/wibble
열 수 없습니다! - 끔찍하게 죽다
답변3
며칠 동안 계속되는 계산을 수행하는 모든 프로그램은 주기적으로 디스크에 충분한 상태를 커밋하도록 설계되어야 합니다. 프로세스를 다시 시작하면 한 시간의 처리 시간이 손실되는 것은 괜찮지만, 그보다 더 많은 시간이 손실되면 해당 프로그램을 제대로 설계되지 않은 프로그램이라고 부릅니다.
즉, 프로세스를 더 오랫동안 활성 상태로 유지하고 그 아래에서 디스크를 교체할 수 있는 다른 시나리오가 있을 수 있습니다. 이러한 상황에서는 파일 시스템을 물리적 미디어에서 분리하는 방법을 살펴봐야 합니다.
가능한 옵션은 다음과 같습니다:
- 소프트웨어 RAID 사용
- 다른 가상 블록 장치 레이어 사용(LVM이 적합할 수도 있음)
- 자체적으로 여러 기본 장치를 사용할 수 있는 파일 시스템을 사용합니다.