macOS / RAM 디스크 백업의 종료 스크립트


0

macOS (10.11)에서 종료 스크립트를 만들려고합니다 . 즉, Mac을 종료하는 스크립트가 아니라 종료시 실행 되는 스크립트입니다. Linux "rc"시스템은 macOS에 없습니다.

솔루션을 검색하고 검색했으며 이것이 내가 찾은 유일한 방법입니다. 시작시 부팅시 시작되며 시작 및 종료 기능은 다음과 같은 경우에 실행됩니다.

#!/bin/bash

function startup()
    {
    ## commands to create and fill ram disk

    tail -f /dev/null &
    wait $!
    }

function shutdown()
    {
    ## commands to backup contents of ramdisk

    exit 0
    }

trap shutdown SIGTERM

startup;

내가 말했듯이 startup () 및 shutdown () 함수는 모두 예상대로 실행됩니다. 문제는 종료 기능의 명령 내에 있습니다. 그것은 매우 간단한 스크립트이며 램 디스크의 내용을 하드 드라이브의 폴더에 복사합니다.

function backup_ramdisk()
    {
    ## empty ram disk backup folder
    rm -R -f /webfolder-backup/*

    ## copy contents of the ramdisk to the ramdisk backup
    cp -R /Volumes/webfolder/ /webfolder-backup/

    ## make me the owner
    chown -R me /webfolder-backup/
    chmod -R 777 /webfolder-backup/ 

    exit 0
    }

실제 스크립트에는 내용을 기록하는 추가 기능이로드되어 전체 스크립트가 실행되는지 확인할 수 있습니다. 그러나 일어나는 일은 cp라인이 실패하는 것입니다. 때때로 완전히 실패하고 백업 폴더가 비어 있습니다. 그러나 더 자주 RAM 디스크 구조의 일부를 가져 와서 정확히 동일한 지점에서 (그러나 정확히는 아니지만) 파일 복사를 중지합니다.

cp: /Volumes/webfolder/: No such file or directory해당 폴더에서 이미 100 개의 항목을 복사 한 경우에도 종종 오류가 발생 합니다. 스크립트가 백업을 완료하기 전에 shutdown 명령이 RAM 디스크를 마운트 해제하고 있다고 생각합니다. RAM 디스크이므로 모든 파일을 복사하는 데 몇 초 밖에 걸리지 않습니다. 그러나 충분하지 않은 것 같습니다. 스크립트가 실행되는 동안 종료 프로세스를 일시 중지 할 수있는 방법이 있다면 계속 진행하십시오. 아니면 이것에 대한 더 나은 접근 방식입니까?


RAMdisk를 사용하는 것보다 일반적인 macOS 디스크 캐싱이 얼마나 느려 집니까?
Mark

나는 더 많은 테스트를 해왔고 여기서 문제는 스크립트의 종료 기능이 실행되는 것과 동시에 RAM 디스크가 마운트 해제된다는 것입니다. . 따라서 필요한 것은 RAM 디스크를 몇 초 동안 그대로 유지하거나이 스크립트가 실행되는 동안 종료 프로세스를 "일시 중지"할 수있는 방법입니다.
l008com

흥미롭게도 변덕 스럽게도 줄 tail -f /dev/null &을 바꾸고 tail -f /Volumes/webfolder/.handle물론 RAM 디스크에 .handle이라는 보이지 않는 파일을 만들었습니다. RAM 디스크에서 파일을 여는 꼬리는 파일을 열어두고 스크립트가 종료 될 때까지 램 디스크를 꺼낼 수없는 상태로 유지합니다. 작동하지 않지만 도움이됩니다. cp줄 과 함께 더 많은 파일을 일관되게 복사하고 있습니다. 그러나 그들 모두는 아닙니다. 따라서 올바른 방향으로 향할 수 있습니다. RAM 디스크를 몇 초 동안 계속 열어 두어야합니다.
l008com

답변:


1

Linux와의 비교에 관하여 : Mac OS X에는 실제로 "rc"시스템이 있습니다. Linux에서 알 수 있습니다 (실제로는 SysV init 시스템이라고합니다). 2005 년에이 시스템은 OS X Lion과 함께 폐기되었으며,보다 현대적인 시스템이 대신 도입되어 훨씬 빠른 부팅을 가능하게했습니다.

그러나 Linux에서는 macOS보다 나중에 동일한 변경이 발생했습니다. 요즘 Linux 배포판은 일반적으로 시스템, 시작 또는 이와 유사한 "현대"시스템을 초기화 시스템으로 사용합니다.

귀하의 솔루션과 관련하여-그것은 실제로 해킹이며 올바른 방법으로 수행되지 않았습니다. 이것이 문제가되는 이유입니다. SIGTERM과 SIGKILL을 모두 트래핑하고 있습니다. 이는 권장 사항이 아니며 "No such file or directory"오류 메시지의 원인입니다.

기본적으로 종료시 발생하는 상황 (Linux와 완전히 유사 함)은 각 프로세스에 SIGTERM이 전송되어 종료해야 함을 알립니다. 그런 다음 프로세스는 종료하는 데 시간이 매우 짧습니다 (즉, 몇 초 이내). 그렇지 않으면 시스템이 SIGKILL 신호를 보내 프로세스가 응답하지 않으면 프로세스를 실제로 종료시킵니다.

복사 시간이 너무 오래 걸리면 신호를 모두 포착 하여 shutdown () 함수를 두 번 실행합니다.

시작된 구성 (예 : 데몬 plist)을 포함하지 않았지만 해킹이 작동하려면 여기에 종속성 및 순서를 구성해야합니다. 그렇지 않으면 종료가 호출되기 전에 RAM 디스크가 마운트 해제 될 위험이 있습니다 (SIGKILL 신호로 인해 두 번째로 종료를 실행할 때 발생할 수 있음).

내가 기억하는 한 /etc/rc.shutdown.local 파일은 여전히 ​​시스템 종료시 프로그램을 실행하는 유효한 방법입니다. 이것이 가장 쉬운 방법입니다.

/etc/rc.shutdown.local 파일을 만들어 실행 가능하게 만드십시오. 현재 스크립트와 같은 shebang으로 시작해야하지만 파일을 백업으로 복사하는 데 사용하는 명령 만 포함하면됩니다.

launchd를 사용하여 올바르게 수행하려면 신호를 올바르게 처리하도록 해킹을 수정 한 다음 xpc_transaction_begin / end 함수를 사용하여 시스템에 프로그램이 유용한 작업을 수행하고 있음을 알리고 종료가 끝날 때까지 종료해야합니다. 또는 시작시 이벤트 트리거 기능을 사용하십시오.

먼저 /etc/rc.shutdown.local을 시도하는 것이 좋습니다. 더 이상 사용되지 않지만 여전히 작동하는 것을 기억하는 한.

작은 경고도 아마 좋은 생각입니다. 시스템 종료 프로그램이 실행된다는 보장은 없습니다. 따라서 RAM 디스크에서 느슨하게하고 싶지 않은 것들을 그러한 디스크에 보관하는 것은 좋지 않습니다. 단일 정전 및 데이터가 손실됩니다. 대신 데이터를 정기적으로 영구 저장소에 백업하기 위해 빈번한 데이터 동기화 또는 이와 유사한 것을 사용하십시오.

더 나은 접근 방식이 존재하는지 여부에 대한 귀하의 요청과 관련하여 "대부분의 경우 예"입니다. 웹 폴더를 RAM 디스크에 복사한다는 아이디어는 다소 역사적이고 오래된 것 같습니다. 해당 웹 폴더로 수행중인 작업에 대한 정보는 없지만 웹 사이트를 제공하고 있고 RAM 디스크를 사용하여 웹 사이트를 빠르게 처리하려는 경우 잘못된 접근 방식입니다. macOS의 내장 vfs 캐싱 기능 (Linux와 같은 다른 최신 운영 체제와 유사)을 사용하는 것이 훨씬 좋습니다.


Mac OS X Lion은 2012 년에 출시되었으며 Tiger는 10.4로 2005 년에 출시되었습니다. 그리고 rc.shutdown.local은 당시에있었습니다. 그러나 지금은 사라졌습니다. 어떤 시스템이 그것을 제거했는지는 알 수 없었지만 10.11에는 그렇지 않습니다. SIGTERM 및 SIGKILL까지는 스크립트에서 SIGKILL을 제거했지만 결과는 변경되지 않았습니다. 그래도 / Volumes / webfolder /에 대한 파일을 찾을 수 없음 오류가 발생합니다. 원본 게시물에서 스크립트를 업데이트하여 어쨌든 반영했습니다.
l008com

시작된 구성과 관련하여 종속성 및 주문을 구성하여 무슨 의미인지 확실하지 않습니다. 나는 그것이 발사 될 때 그런 것을 들어 본 적이 없다. launchd.plist에는 Label, Disabled (false), Program 및 RunAtLoad 속성 세트 만 있습니다. 또한 생각할 때 스크립트가 종료 될 때 문제가 발생하기 때문에 시작된 종속성이 여기에 어떻게 적용됩니까? 시작시 "이벤트 트리거 기능"을 사용하는 옵션도 언급했습니다. 그것에 대해 자세히 설명해 주시겠습니까?
l008com

마지막으로 xpc_transaction_begin을 봤지만 애플 프로그래밍 API처럼 보이지만 쉘 스크립트에서 호출 할 수있는 것은 아닙니다. RAM 디스크 경고에 관해서는 모든 것을 알고 있으며 파일을 안전하게 유지하기 위해 여러 개의 다른 시스템이 있습니다. 그러나 그렇습니다. 누군가가 이것을 읽고 비슷한 것을하고 싶다면, 시작시 RAM 디스크를 만든 다음 종료시 백업하는 간단한 스크립트로는 충분하지 않습니다!
l008com

@ jksoegaard-귀하의 쓰기가 내 상황에 도움이 될 것이라고 생각합니다. 시스템 종료 / 재부팅의 일부로 기능을 실행할 수 있도록 종료 신호를 포착하는 것도 포함됩니다. 내 VM을 일시 중단하는 것과 관련이 있으며 OP의 질문의 RAM 디스크 측면으로 인해 OP가 너무 많은 관심을 얻은 것으로 생각합니다. 그럼에도 불구하고, 당신이 그것을 암시하는 것처럼 보이지만 SIGTERM 만 갇혀 있으면 몇 초만 걸리는 작업에 종료 시간을 주어야한다는 것을 확인할 수 있습니까?
tim.rohrer

예, 그러나 "몇 초"는 시스템에 따라 크게 다릅니다. 즉, 그것에 따라 어떤 종류의 시간을 주 었는지 테스트하십시오.
jksoegaard 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.