OS X 매버릭스에서 터미널 명령어가 적용되지 않거나 plist 수정 및 교체가 불가능 할 때 해결 방법

2014.02.10 17:58    작성자: ONE™

그동안 블로그에 올린 글을 살펴보고 재정비하면서 두 가지 심각한 문제를 발견했습니다. 블로그를 통해 소개한 여러 터미널 명령어 중 적지 않은 수가 OS X 매버릭스 환경에서 제대로 작동하지 않거나, 적용 이전 상태로 자동으로 복구되는 현상이 목격된 것입니다.

예를 들어, OS X 10.8 마운틴 라이언에서는 터미널에 defaults write com.apple.Dock showhidden -bool YES && killall Dock 명령어를 입력하면 command + h 단축키로 잠시 사용하지 않는 응용 프로그램을 감추는 동시에 독 아이콘을 반투명하게 표시할 수 있었습니다. 앞서 링크를 통해 소개했 드렸던 팁입니다. ▼

하지만 OS X 매버릭스에서는 터미널 명령어를 적용하더라도 변경사항이 실시간으로 바로 반영되지 않습니다. 마치 아예 존재하지 않는 명령어를 입력한듯 말이죠. 이 외에도 적용되지 않는 터미널 명령어가 다양하고, plist 파일을 사용자가 임으로 삭제했을 시 프로그램이 초기화되지 않는 현상과 타임머신에 미리 저장해둔 파일로 덮어씌운 경우 이전 환경이 제대로 적용되지 않는 현상 등도 발생합니다. 애플포럼에도 이와 연관해 관련 포스팅이 있었습니다.

맥 운영체제와 또 그 안에서 구동되는 맥용 프로그램은 바이너리 또는 아스키 코드로 이뤄진 XML 프로퍼티 리스트 파일에 각종 설정 값을 저장하는데, 운영체제와 프로그램을 최초 실행할 시 자동으로 생성되며 운영체제와 프로그램이 어떻게 작동하는지 그 특성을 결정합니다. /Library/Preferences 또는 ~/Library/Preferences 폴더에 있는 plist 확장자를 가지는 파일이 그것입니다. 

OS X 시스템 환경설정 패널이나 앱의 환경설정 창에서 슬라이드바를 조절하거나 상자를 체크하면 이 plist 파일이 수정되며 변경 사항이 반영됩니다. 또 사용자가 원할 시 터미널에서 각종 defaults 명령어를 입력해 환경설정에 없는 기능도 끄고 켤 수 있습니다. 소위 말하는 'OS X의 숨겨진 기능'이 바로 그것이죠.

OS X 매버릭스는 기존 운영체제와 plist 파일을 관리하는 방법이 달라요

그런데 OS X 10.9 매버릭스부터 plist 관리 체계가 확 달라졌습니다. 매버릭스는 plist 파일을 모두 캐시 형태로 저장하고 이 캐시에서 파라미터를 읽기 때문에 프로그램을 구동할 때마다 로컬 디스크에서 관련 파일을 일일히 읽어오지 않습니다. 램에서 바로 데이터를 읽어오니 로컬 디스크에서 파일을 읽을 때보다 로딩 속도가 더 빠르고, HDD 회전을 줄여 맥북 등에서 배터리를 절감할 수 있다는 장점이 있습니다. 겉으로는 잘 드러나지 않는 부분이죠.

또 종종 plist 파일이 손상되는 바람에 운영체제나 프로그램이 비정상적으로 작동하는 경우가 발생하는데, 이제 이런 문제도 시스템이 자체 방지하는 메커니즘이 도입된 것으로 보입니다. plist 파일이 삭제되거나 손상되는 경우 캐시 파일에 저장된 데이터를 이용해 plist 파일을 새로 생성합니다. 

백그라운드에서는 캐시를 관리하기 위해 cfprefsd라는 데몬 프로세스가 상시 구동됩니다. 정확히 어떤 주기로 캐시가 flush되고 rebuild 되는지는 웹에서 관련 자료를 찾을 수 없었습니다.

새로운 캐시 기술 때문에 발생하는 문제점

파일이 아닌 캐시에서 파라미터를 불러오는 매커니즘으로 인해 다음과 같은 불편함이 발생합니다. 모두 터미널 명령어를 적용하거나 plist 파일을 교체하더라도 캐시 상에 있는 데이터를 우선 참조하기 때문에 발생하는 문제입니다. 

• 구 운영체제에서 흔히 사용하던 터미널 명령어로 plist 파일을 수정하더라도 변경사항이 즉시 적용되지 않습니다.
• 시스템 복원시 기존에 사용하던 환경을 유지하기 위해 타임머신, 외장하드 등에서 plist 파일을 새 시스템으로 옮겨오더라도 변경사항이 즉시 적용되지 않습니다.
• 특정 앱을 최초 구동 상태로 만들기 위해 앱과 관련된 plist 파일을 모두 삭제하더라도 앱이 초기화되지 않습니다.
• 앱 개발자나 고급 사용자의 경우 plist 편집을 통한 디버깅 작업이 까다롭습니다

해결 방법

OS X 매버릭스의 기본 특성이다 보니 이런 불편함을 원천적으로 해결하는 것은 불가능하지만, 우회할 수 있는 방법은 있습니다. 바로 plist를 사용자가 수정하거나 교체, 삭제했을 시 cfprefsd 프로세스가 변경사항을 신속하게 인지하도록 하는 것입니다.

방법 1. plist 수정 시 defaults read 명령어 사용하기

OS X이나 응용 프로그램을 사용자화하기 위해 터미널 명령어를 적용하거나, 또는 다른 장소에서 plist 파일을 가지고 왔다면 다음 명령어를 사용해 변경사항을 시스템에 인지시킬 수 있습니다.

defaults read

예를 들어, 터미널에서 defaults write com.apple.Dock showhidden -bool YES 를 사용해 독 아이콘을 반투명하게 만드는 명령어를 적용했다면, 곧 바로 defaults read com.apple.Dock 명령어를 입력해 시스템이 설정값을 인지시킵니다. 이후 killall Dock을 입력해 독을 재실행하거나 계정을 재로그인해 변경사항을 반영하도록 합니다.

defaults write com.apple.Dock showhidden -bool YES
defaults read com.apple.Dock

시스템 plist가 아닌 특정 응용 프로그램의 plist를 수정해야 할 때는 ~/Preferences/ 폴더에서 해당 프로그램의 plist 파일을 찾은 후 같은 방식으로 defaults read 명령어를 입력합니다. 다만 이때는 경로까지 같이 입력해야 합니다.

defaults read ~/Preferences/com.parallels.Parallels Desktop.plist

맥 앱스토어 등을 통해 배포되는 샌드박스(sandbox)화 된 앱은 설정 파일이 ~/Preferences/Containers/ 폴더에 저장되기 때문에 경로가 조금 더 복잡합니다. 이때는 차라리 Containers 폴더 속의 앱 관련 폴더를 통째로 삭제하고 아래 방법을 쓰는 것이 더 편리합니다.

방법 2. cfprefsd 프로세스 재실행

앞서 plist 캐시 파일을 관리하기 위해 cfprefsd라는 백그라운드 프로세스가 상시 구동된다고 말씀드렸습니다. 

cfprefsd 프로세서는 강제로 종료하더라도 금방 다시 실행되는데, 이때 plist 파일에 변경사항이 있는지 확인하고 있을 시 이를 바로 반영합니다. cfprefsd 프로세서를 강제로 종료하는 방법은 다음과 같으며, plist 수정 작업 또는 교체 작업 후 바로 시행해 주면 됩니다.

1. 응용 프로그램 > 유틸리티 폴더에 있는 '활성 상태 보기(Activity Monitor.app)'를 실행합니다. 그리고 메뉴 막대 > 보기에서 '나의 프로세스'를 선택합니다. ▼

2. CPU 탭의 검색 창에 cfprefsd를 입력해 해당 프로세스를 찾습니다. 이후 해당 프로세스를 선택한 상태에서 창 좌측 상단에 있는 x 모양의 아이콘 선택 시 나타나는 메뉴에서 '강제 종료'를 클릭합니다.. ▼

아래 터미널 명령어도 위 활성 상태 보기에서 진행하는 작업과 같은 효과를 가집니다. ▼

killall -SIGTERM cfprefsd

OS X 매버릭스는 이전 맥 운영체제보다 프로퍼티 리스트 파일을 수정하거나 교체, 삭제하는 작업이 매우 까다로워졌습니다. 덕분에 블로그에 수정해야할 터미널 명령어 관련 포스팅이 산더미입니다. 시스템의 성능과 안정성을 위해 도입된 기술 때문에 감수해야할 불편함이 생긴 것인데, 다행히 위와 같이 몇 가지 유효한 방법을 통해 문제를 우회할 수 있는 길이 있습니다. 

매버릭스를 쓰시는 분들, 그 중에서도 터미널 명령어를 평소 적극 활용하시는 분들이라면 plist를 캐시하는 매버릭스의 특성과 이런 특성을 우회 방법을 필히 알아두시는 것이 좋을 것 같습니다.



참조
Apple Developer Forum - NSUerdefaults not saving preferences for some users on Mavericks
Deleting plist file does not reset app on Mac OS 10.9 Mavericks
AppleForum - MacOS X 10.9 Mavericks의 cfprefsd의 문제

관련 글
• OS X의 독(Dock)을 자유자재로 주무르는 5가지 방법
• OS X을 민첩하게 만들어주는 터미널 명령어 7가지
• OS X과 소프트웨어에 숨겨져 있는 각종 비밀 기능들은 도대체 어떻게 발견되는걸까?

저작자 표시 비영리 변경 금지
신고
    
  1. Blog Icon
    눈빛마음

    왠지 윈도우 레지스트리가 생각나는 대목이네요.

  2. Blog Icon
    러브링고

    좋은 정보 감사합니다. 그런데 ONE님 얼마전부터 새 게시글이 올라오면 오던 푸시알람이 안오고 있는데 혹시 인지하고 계시는지요. 마땅히 여쭤볼만한 곳이 없어 이곳에 올리는점 양해바랍니다.

  3. Blog Icon
    TNT

    우선 전 잘옵니다...

  4. Blog Icon
    Joshua

    안타깝게도 전 안 옵니다...;;;
    푸시가 오지 않아..트위터를 통해 확인하고 있습니다.

  5. 저는 잘 오고있습니다
    다만 오랜시간동안 잠자기에 들어가있었다면
    푸시를 받아오지 못하는 듯 합니다.

  6. Blog Icon
    Jun

    저도 안오던데요.....ㅜㅜ 방법이 있나요?

  7. Blog Icon
    chesterkoong

    아~어려운 글이군요

  8. Blog Icon
    까만하늘

    왜 저는 하나도 안될까요? 투명하게 하는거 전혀안되요. command+h로 프로그램은 감춰지는데 독아이콘이 반투명해지지는 않네요.

  9. Blog Icon
    GJ

    위의 방법을 사용했지만 프로그램을 실행시키면 plist 파일이 계속하여 재 생성 됩니다. plist 파일을 삭제 해야 플러그인 상에서 프리셋을 저장하거나 하는 일이 가능해 지는데, 삭제후 재 생성되게 하지 않는 방법은 없을까요?

  10. Blog Icon
    idumees

    필독사항이네요.
    감사합니다.