macOS 맥북에서 클램쉘 Clamshell 모드를 강제로 해제하는 방법

MacBook 사용자들 중 일부는 외장 모니터를 사용하여 화면을 확장하거나, 여러 작업을 동시에 수행하기도 합니다. 이런 상황에서 MacBook의 Clamshell 모드는 매우 유용한 기능으로 작용합니다.

Clamshell 모드란 MacBook의 덮개를 닫은 상태에서도 외장 모니터를 통해 작업을 계속할 수 있게 해주는 모드를 말합니다. 이 모드는 사용자가 더 넓은 화면에서 편안하게 작업하도록 돕거나, 여러 모니터를 동시에 사용할 수 있도록 지원합니다. 하지만 이 모드는 MacBook의 덮개를 닫은 상태에서도 외장 모니터가 잠자기 상태로 전환되지 않게 하는 기능을 포함하고 있어, 일부 사용자들에게는 불편함을 초래할 수 있습니다.

특히 M1이후 Apple Silicon 칩이 탑재된 최신 MacBook에서는 Clamshell 모드가 기본적으로 적용되어 있어, 외장 모니터를 연결한 상태에서 MacBook의 덮개를 닫더라도 연결된 모니터는 잠자기 상태로 전환되지 않습니다. 이로 인해 사용자들은 원치 않는 상황에서도 모니터가 켜져 있는 상황을 경험하게 됩니다.

하지만 Apple은 이를 위한 별다른 설정 옵션을 제공하지 않아 만약 외장 모니터가 연결된 상태에서 MacBook의 덮개를 닫으면 바로 절전모드로 전환되도록 하고 싶은 경우 noclamshell이라는 서드파티 도구를 사용해야 합니다.

아래 설명은 comeinsidebox.com 에서 테스트 및 검증 후 작성 된 내용이지만 이것이 본문의 내용의 정확성이나 신뢰성에 대해 보증을 하는 것은 아니니 단순 하게 참고용으로 확인바랍니다.

튜토리얼 환경: macOS Sonoma 14.2.1 (M1), noclamshell 1.3v

noclamshell이란

noclamshell은 MacBook의 Clamshell을 비활성화할 수 있도록 도와주는 서드파티 도구 입니다. Clamshell 모드란 맥북의 노트북 덮개를 닫은 상태에서도 외부 디스플레이나 프로젝터를 사용할 수 있는 기능을 의미합니다. 즉, 전원 어댑터와 외부 모니터가 연결된 상태에서 노트북 덮개를 닫아도 컴퓨터가 작동을 멈추지 않는 것입니다. Clamshell 모드 더 알아보기

그러나 일부 사용자들은 노트북 덮개를 닫았을 때 컴퓨터가 잠자기 모드로 들어가길 원할 수 있지만 Clamshell 모드에서는 이런 예외가 적용되지 않고, 설정에서도 이 기능을 끄는 옵션은 제공되지 않습니다. 이처럼 MacBook의 Clamshell 모드를 비활성화하는 방법을 찾는 사용자들을 위한 대안으로 noclamshell이 있습니다.

#!/usr/bin/env bash

LID_CLOSED=$(ioreg -r -k AppleClamshellState | grep AppleClamshellState | grep Yes)
if [ "$LID_CLOSED" ]; then
  EXTERNAL_DISPLAY_CONNECTED=$(pmset -g powerstate | grep AppleDisplay | grep USEABLE)
  if [ "$EXTERNAL_DISPLAY_CONNECTED" ]; then
    AWAKE=$(pmset -g powerstate | grep IODisplayWrangler | grep USEABLE)
    if [ "$AWAKE" ]; then
      pmset sleepnow
    fi
  fi

  NUM_DEVICE_PROXY=$(pmset -g powerstate | grep DCPDPDeviceProxy | wc -l)
  ARM_AWAKE=$((NUM_DEVICE_PROXY < 4))
  if [ "$ARM_AWAKE" ]; then
    pmset sleepnow
  fi
fi

noclamshell은 작성일을 기준으로위와 같은 bash 스크립트로 구성되어 있으며 각 줄은 다음과 같이 동작합니다. 관련 내용은 pirj 저장소에서 확인할 수 있습니다.

  • #!/usr/bin/env bash: 이 부분은 스크립트가 bash 셸에서 실행되어야 함을 나타냅니다.
  • LID_CLOSED=$(ioreg -r -k AppleClamshellState | grep AppleClamshellState | grep Yes): ioreg 명령을 사용하여 AppleClamshellState의 상태를 확인하고, 그 결과가 Yes인지 확인합니다. Yes라면 덮개가 닫혔음을 의미하며, 이를 LID_CLOSED 변수에 저장합니다.
  • if [ $LID_CLOSED ]; then: 덮개가 닫혔는지 확인합니다. 닫혔다면 다음 코드를 실행합니다.
  • EXTERNAL_DISPLAY_CONNECTED=$(pmset -g powerstate | grep AppleDisplay | grep USEABLE): pmset 명령을 사용하여 AppleDisplay의 상태를 확인하고, 그 결과가 USEABLE인지 확인합니다. USEABLE이라면 외부 디스플레이가 연결되어 있음을 의미하며, 이를 EXTERNAL_DISPLAY_CONNECTED 변수에 저장합니다.
  • if [ $EXTERNAL_DISPLAY_CONNECTED ]; then: 외부 디스플레이가 연결되어 있는지 확인합니다. 연결되어 있다면 다음 코드를 실행합니다.
  • AWAKE=$(pmset -g powerstate | grep IODisplayWrangler | grep USEABLE): pmset 명령을 사용하여 IODisplayWrangler의 상태를 확인하고, 그 결과가 USEABLE인지 확인합니다. USEABLE이라면 시스템이 활성 상태임을 의미하며, 이를 AWAKE 변수에 저장합니다.
  • if [ $AWAKE ]; then: 시스템이 활성 상태인지 확인합니다. 활성 상태라면 다음 코드를 실행합니다.
  • pmset sleepnow: pmset 명령을 사용하여 시스템을 즉시 잠자기 상태로 전환합니다.
  • NUM_DEVICE_PROXY=$(pmset -g powerstate | grep DCPDPDeviceProxy | wc -l): pmset 명령을 사용하여 DCPDPDeviceProxy의 개수를 확인하고, 이를 NUM_DEVICE_PROXY 변수에 저장합니다. DCPDPDeviceProxy는 macOS 시스템에서 주변기기의 상태를 나타내는 항목입니다. 이 항목은 연결된 디스플레이, 키보드, 마우스 등 다양한 하드웨어 장치의 상태를 체크하는 데 사용됩니다.
  • ARM_AWAKE=$((NUM_DEVICE_PROXY < 4)): NUM_DEVICE_PROXY 변수의 값이 4보다 작은지 확인하고, 그 결과를 ARM_AWAKE 변수에 저장합니다. 만약 4보다 작다면, 이는 ARM 기반 시스템이 활성 상태임을 의미합니다.
  • if [ $ARM_AWAKE ]; then: ARM 기반 시스템이 활성 상태인지 확인합니다. 활성 상태라면 다음 코드를 실행합니다.
  • pmset sleepnow: pmset 명령을 사용하여 시스템을 즉시 잠자기 상태로 전환합니다.
macOS 맥북 사용자 계정을 추가하거나 삭제하는 방법

Homebrew 설치

Homebrew-홈-페이지
Homebrew 홈 페이지

noclamshell을 사용하기 위해서는 다음 명령으로 Homebrew를 설치해야 합니다. macOS에서 homebrew 설치하기

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
참고: 스크립트 파일이기 때문에 Homebrew로 설치하지 않고 직접 파일을 생성한 뒤 서비스로 등록해도 되지만 관리적인 측면에서 Homebrew가 편리하니 이 방식으로 사용하는 것을 권장합니다.

noclamshell 설치 및 활성화

전술한대로 noclamshell은 짧은 bash 스크립트이며 해당 스크립트를 실행해서 Clamshell 모드를 해제할 수 있습니다. 이를 통해 덮개가 닫혔을 때 외부 디스플레이가 연결되어 있을지라도 시스템을 자동으로 잠자기 상태로 전환하는 역할을 합니다.

brew로-noclamshell-설치
brew로 noclamshell 설치

터미널을 열고 다음 명령을 작성하거나 붙여넣고 Enter키로 실행하면, pirj 사용자의 noclamshell 저장소에서 noclamshell 패키지를 설치하게 됩니다.

brew install pirj/noclamshell/noclamshell

이어서 다음 명령으로 noclamshell 서비스를 시작합니다. 이 명령을 실행하면, noclamshell 스크립트가 백그라운드에서 실행되기 시작하며, 이는 맥북의 덮개가 닫혔을 때 시스템을 자동으로 잠자기 상태로 전환하는 역할을 합니다.

brew services start noclamshell

이제 MacBook의 Clamshell 모드를 비활성화하고, 덮개를 닫았을 때 외장 모니터도 잠자기 모드로 전환됩니다.

맥 OS X 에서 오류로 멈춘 프로그램을 강제 종료 하는 방법

noclamshell 스크립트 개선(선택)

앞선 설명에 사용된 스크립트는 현재 개발자의 Github 저장소에 등록된 스크립트로 외부 디스플레이의 연결 상태를 먼저 확인하여 시스템을 잠자기 상태로 전환합니다.

다만, DCPDPDeviceProxy의 개수가 잠자기 모드로 전환하는 데 영향을 주는 중요한 요소이지만, 이 조건이 외부 디스플레이 연결 상태 확인 후에 체크되므로 일부 상황에서는 시스템이 잠자기 모드로 전환되지 않을 수 있습니다. 그래서 DCPDPDeviceProxy를 먼저 체크하여, 이 조건이 충족되지 않는 경우 즉시 시스템을 잠자기 모드로 전환하고 싶은 경우 스크립트 파일을 찾아 다음 작업을 진행합니다.

noclamshell-경로
noclamshell 경로

Terminal을 열고 /opt/homebrew/bin/ 경로로 이동후 noclamshell 스크립트 파일을 확인하면 아래와 같이 기본적으로 심볼릭 링크(Symbolic Link)입니다.

noclamshell -> ../Cellar/noclamshell/1.3/bin/noclamshell
Terminal에서-noclamshell-파일-열기
Terminal에서 noclamshell 파일 열기

아래 명령을 통해 noclamshell 파일을 TextEdit으로 열어 줍니다.

open -a "TextEdit" /opt/homebrew/Cellar/noclamshell/1.3/bin/noclamshell
파일-수정
파일 수정

에디터에서 기존 스크립트를 아래 스크립트로 변경하고 저장합니다.

#!/usr/bin/env bash
LID_CLOSED=$(ioreg -r -k AppleClamshellState | grep AppleClamshellState | grep Yes)
if [ "$LID_CLOSED" ]; then
    CLAMSHELL=$(pmset -g powerstate | grep DCPDPDeviceProxy | wc -l)
    if (( CLAMSHELL < 4 )); then
          pmset sleepnow
    fi
  EXTERNAL_DISPLAY_CONNECTED=$(pmset -g powerstate | grep AppleDisplay | grep USEABLE)
  if [ "$EXTERNAL_DISPLAY_CONNECTED" ]; then
    AWAKE=$(pmset -g powerstate | grep IODisplayWrangler | grep USEABLE)
    if [ "$AWAKE" ]; then
      pmset sleepnow
    fi
  fi
fi
잠금-해제
잠금 해제

파일이 잠겨 있다는 메시지가 나오는 경우가 있는데 잠금 해제를 누르면 수정 및 저장이 가능합니다.

스크립트를 수정한 후에는 해당 서비스를 재시작해야 변경 사항이 적용됩니다.

brew services restart noclamshell

noclamshell 제거(Clamshell 모드 복구)

다시 원래 상태로 Clamshell 모드를 사용하고 싶은 경우 다음 과정으로 되돌릴 수 있습니다.

noclamshell-서비스-중지
noclamshell 서비스 중지

터미널을 열고 다음 명령을 작성하거나 붙여넣고 Enter키로 실행합니다. 앞서 등록된 noclamshell 서비스를 중지합니다.

brew services stop noclamshell

이어서 다음 명령어를 실행해 noclamshell 패키지를 제거합니다.

brew uninstall pirj/noclamshell/noclamshell
Windows에서 작업 관리자를 실행하는 방법들

관련 글

댓글로 남기기 어려운 내용은 Contact Form 에서 개별적으로 문의 할 수 있습니다. 해당 글과 연관 된 내용은 Copy를 이용해 현재 페이지의 주소를 복사 후 문의 폼에 입력시 보다 정확한 답을 얻을 수 있습니다.

Leave a Comment