내 프로그램에서 몇 초 내에 정전이 발생할 것임을 감지하면 데이터 손상을 방지하기 위해 어떤 조치를 취할 수 있습니까?

내 프로그램에서 몇 초 내에 정전이 발생할 것임을 감지하면 데이터 손상을 방지하기 위해 어떤 조치를 취할 수 있습니까?

파일 시스템에서 읽고 써야 하는 프로그램에는 외부 센서와 통신할 수 있는 추가 기능이 있습니다. 따라서 정전이 임박했는지 알 수 있는 고유한 기능이 있습니다. 제가 받은 경고는 단 몇 초(약 3~5초)에 불과했습니다. 전체 종료를 수행하기에는 충분하지 않았습니다. 몇 초의 귀중한 시간이 추가될 수 있지만 하드웨어 비용이 추가됩니다.

파일에 쓴다고 해서 운영 체제가 해당 작업을 수행할 수 있다는 보장은 없기 때문입니다.지금, 내가 아는 한 파일을 닫는 것만으로도 OS는 나중에 아무도 파일에 액세스하려고 시도하지 않으면 파일을 닫을 것이라고 결정하게 되므로 어떻게 보장할 수 있습니까?

  1. 지금 수행하는 모든 쓰기가 저장됩니다. (경고를 받은 후 내 프로그램은 몇 킬로바이트를 디스크에 기록하지만 경고를 받기 전에 많은 데이터가 기록되었을 수 있으며 OS가 아직 완료하지 않았을 수도 있습니다.)
  2. 운영 체제의 부적절한 종료로 인해 다른 손상이 발생할 수 없습니다.

참고: 설계에 따라 정전이 자주 발생할 수 있습니다. 또한 설계상 시스템에서 실행되는 다른 "사용자 응용 프로그램"이 없습니다(따라서 음악 플레이어, 개발 환경, 스프레드시트 편집기 및 김프가 모두 실행되고 파일 시스템에 액세스하는 것에 대해 걱정할 필요가 없습니다).

답변1

당신이해야 할 가장 중요한 일은 문제를 해결하는 것입니다sync시스템 호출. sync이를 수행할 수 있는 유틸리티 가 있습니다 . sync시스템 호출이 반환 되면 sync모든 파일 시스템 쓰기 작업이 완료되기 전에(마운트된 파일 시스템에서) 실행되도록 보장합니다.

일련의 쓰기 작업 중에 이런 일이 발생하더라도 데이터를 계속 사용할 수 있도록 설계하는 것은 애플리케이션에 달려 있습니다. 그러나 가동 중단 전 경고 기간이 보장된 경우 가동 중단 알림에 대한 시기적절한 응답을 보장하는 한 애플리케이션 설계가 엉성해질 수 있습니다(어려움).

ext4와 같은 저널링 파일 시스템의 경우 동기화한 다음 전원을 끄면 재부팅 시 fsck를 수신하지 않습니다. 그러나 어떤 이유로 동기화 후 쓰기가 발생하면 fsck가 필요할 수 있다고 생각하지만 그런 경우는 드뭅니다. 확실하게 확인하려면 전원이 꺼지기 전에 모든 읽기-쓰기 파일 시스템을 마운트 해제하거나 최소한 읽기 전용으로 다시 마운트하십시오. 일반적으로 쓰기용으로 열려 있는 파일이 있으면 이 작업을 수행할 수 없습니다. 시스템이 Linux를 실행하는 경우 다음을 사용할 수 있습니다.마법 시스템기능(활성화되어 있는지 확인해야 함) 이는 문자를 작성하여 프로그래밍 방식으로 호출할 수 있습니다 /proc/sysrq-trigger. echo u >/proc/sysrq-trigger모든 파일 시스템이 읽기 전용으로 다시 마운트되도록 합니다(여기에는 동기화 효과가 포함됩니다). 설정이 작동하면 이 인터페이스를 사용하여 재부팅( b)하거나 전원을 끄는( ) 수도 있습니다 .o

정전 알림이 억제될 수 있는 경우 sync: 을 호출하면 성능에 부정적인 영향을 미치지 않습니다. 반면, 읽기 전용 설치를 강제하는 것은 일반적으로 복구할 수 없으므로 재부팅을 수행하는 경우에만 이 작업을 수행하십시오.

귀하의 설명과 일치하는 대부분의 설정에 대해 이는 정전 알림에 대한 합리적인 응답입니다.

  1. 영향을 받는 프로세스에 사용자 지정 신호(예: SIGUSR1 또는 SIGPWR)를 보내 다음 시작 시 복구를 더 쉽게 하는 데 도움이 되는 경우 진행 중인 트랜잭션을 신속하게 커밋하거나 중단하도록 지시합니다.
  2. 정전이 예상되기 전에 약간의 지연을 기다리십시오. 나머지 작업을 위한 충분한 공간이 있도록 보정하십시오.
  3. 로그 메시지를 작성합니다.
  4. echo u >/proc/sysrq-trigger

관련 정보