목차
안녕하세요, 여러분! Homebrew(`brew`)를 이용해서 macOS에 다양한 패키지를 설치하고 관리하는 편리함에 익숙해지셨나요? 🥳 brew install
몇 번이면 필요한 프로그램이 뚝딱 설치되니 정말 신세계죠! 특히 웹 서버나 데이터베이스처럼 백그라운드에서 계속 실행되어야 하는 서비스들은 brew services start
명령어로 간단하게 시작할 수 있어서 더욱 편리했을 거예요. 그런데 혹시 brew services
말고 다른 방법은 없을까?’, ‘좀 더 세밀하게 제어하고 싶은데…’ 하는 생각을 해보신 적 없으신가요? 🤔 바로 그럴 때 필요한 것이 macOS의 숨은 일꾼, launchd랍니다! 오늘은 brew 사용자분들이 launchd에 대해 궁금해하실 만한 내용들을 쏙쏙 뽑아 알려드릴게요. 왜 launchd가 필요하고, 어떻게 사용하는지, 그리고 핵심인 plist
파일은 무엇인지! 저와 함께 차근차근 알아보아요! 😊
Brew만으로는 부족해? launchd가 필요한 이유
많은 분들이 “brew services
명령어가 있는데 굳이 launchd
를 알아야 하나요?” 하고 질문하실 수 있어요. 아주 좋은 질문이랍니다! 👍 사실 brew services 명령어는 launchd를 더 쉽게 사용할 수 있도록 감싸놓은(wrapping) 편리한 도구예요. 즉, brew services start mysql
같은 명령어를 입력하면, 내부적으로는 brew가 launchd에게 “MySQL 서비스를 시작해줘!”라고 요청하는 방식인 거죠.
그리고 brew services
는 기본적인 시작, 중지, 재시작 등의 기능만 제공해요. 만약 특정 시간에만 서비스를 실행하고 싶거나, 특정 파일이나 디렉토리에 변화가 생겼을 때 자동으로 스크립트를 실행하고 싶거나, 혹은 서비스가 예기치 않게 종료되었을 때 자동으로 재시작하는 등의 더 세밀하고 복잡한 제어가 필요하다면? 그럴 때는 launchd
를 직접 다루는 방법을 알아야 한답니다. 🧐 마치 자동차의 자동 변속기(brew services)와 수동 변속기(launchd)의 차이 같다고 할까요? 자동 변속기가 편리하긴 하지만, 때로는 수동 변속기처럼 직접 기어를 조작하며 더 섬세한 운전(제어)을 하고 싶을 때가 있잖아요! 😉 launchd는 바로 그런 macOS 시스템의 핵심적인 백그라운드 작업 관리 시스템이기 때문에, 알아두면 맥 활용 능력이 한 단계 업그레이드될 거예요!
launchd의 핵심 열쇠, plist 파일 파헤치기
자, 그럼 `launchd`를 직접 다루려면 무엇을 알아야 할까요? 바로 plist(Property List) 파일입니다! ✨ `launchd`는 어떤 작업을, 언제, 어떻게 실행할지에 대한 설정 정보를 바로 이 `plist` 파일에서 읽어와요. `plist` 파일은 XML(Extensible Markup Language) 형식으로 작성된 텍스트 파일인데요, 처음 보면 조금 복잡해 보일 수 있지만 걱정 마세요! 기본적인 구조와 몇 가지 중요한 키(key)만 알면 생각보다 쉽게 이해하고 작성할 수 있답니다.
가장 기본적인 `plist` 파일의 구조와 필수 키 몇 가지를 살펴볼까요?
- Label (문자열): 이 작업의 고유한 이름이에요. 보통
com.회사이름.프로그램이름
같은 역 도메인 형식을 사용해서 중복되지 않게 만들어요. launchd가 작업을 식별하는 중요한 키랍니다! - ProgramArguments (배열): 실제로 실행할 프로그램(명령어)과 그 인자(argument)들을 순서대로 적어주는 부분이에요. 배열의 첫 번째 요소가 실행할 프로그램 경로이고, 나머지가 전달될 인자들이죠.
- RunAtLoad (불리언):
true
로 설정하면, 이plist
파일을 launchd에 로드(load)할 때 즉시 작업을 실행해요. 시스템 부팅 시나 로그인 시 자동으로 프로그램을 실행하고 싶을 때 사용한답니다. - KeepAlive (불리언 또는 딕셔너리):
true
로 설정하면 작업이 어떤 이유로든 종료되었을 때 launchd가 자동으로 다시 실행시켜줘요. 항상 실행되어야 하는 중요한 서비스에 유용하겠죠? 😉
예를 들어, brew로 설치한 nginx 웹 서버를 launchd로 직접 관리하고 싶다면, 다음과 같은 plist 파일을 작성할 수 있어요. (경로는 예시이며 실제 설치 경로에 맞게 수정해야 해요!)
<!--?xml version="1.0" encoding="UTF-8"?-->
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.nginx</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/opt/nginx/bin/nginx</string>
<string>-g</string>
<string>daemon off;</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
이 plist
파일은 com.example.nginx
라는 이름으로, /opt/homebrew/opt/nginx/bin/nginx -g 'daemon off;' 명령어를 실행하고, 로드될 때 바로 실행하며, 종료되면 자동으로 재시작하도록 설정하는 내용이랍니다. 간단하죠? 😊
launchd 직접 다루기: launchctl 기본 명령어 정복
자, 이제 plist
파일이라는 설계도를 만들었으니, launchd에게 이 설계도를 전달하고 작업을 지시해야겠죠? 이때 사용하는 명령어가 바로 launchctl입니다! 🚀 터미널에서 launchctl 명령어를 사용하면 launchd에 작업을 등록하거나 제거하고, 시작하거나 중지하는 등 다양한 제어를 할 수 있어요.
초보자분들이 꼭 알아야 할 기본적인 launchctl
명령어들을 알아볼까요?
- load [plist 파일 경로]: 작성한
plist
파일을 launchd에 등록(로드)합니다. 이 명령어를 실행해야 launchd가 해당 작업을 인지하고 관리하기 시작해요. -w 옵션을 함께 사용하면 비활성화된(`Disabled`) 상태로 로드된 작업을 활성화 상태로 변경하며 로드할 수 있어요. - unload [plist 파일 경로]: launchd에 등록된 작업을 제거(언로드)합니다. 더 이상 launchd가 해당 작업을 관리하지 않게 돼요. -w 옵션을 함께 사용하면 작업을 비활성화 상태로 만들면서 언로드합니다.
- start [Label 이름]: launchd에 등록된 작업을 즉시 시작합니다.
plist
파일의 Label 키에 지정한 고유한 이름으로 작업을 식별해요. - stop [Label 이름]: 실행 중인 작업을 중지합니다. KeepAlive 설정이 true라면 잠시 후 다시 시작될 수 있어요.
- list: 현재 launchd에 로드된 모든 작업의 목록을 보여줍니다. 특정 작업이 로드되었는지, 현재 상태(PID, Status)는 어떤지 확인할 때 유용해요. grep과 함께 사용하여 특정 레이블을 찾을 수도 있겠죠? (launchctl list | grep com.example.nginx)
예를 들어, 위에서 만든 com.example.nginx.plist
파일을 홈 디렉토리의 Library/LaunchAgents
폴더에 저장했다고 가정해 볼게요. (사용자 레벨에서 실행되는 작업은 보통 여기에 저장해요. 시스템 전체에 적용되는 데몬은 /Library/LaunchDaemons
에 저장하고, 로드/언로드 시 sudo가 필요할 수 있답니다.)
터미널에서 다음 명령어를 실행하면 nginx서비스를 launchd로 관리할 수 있어요.
# plist 파일 로드 (및 활성화)
launchctl load -w ~/Library/LaunchAgents/com.example.nginx.plist
# 서비스 즉시 시작 (RunAtLoad가 true면 자동으로 시작됨)
launchctl start com.example.nginx
# 서비스 중지
launchctl stop com.example.nginx
# 서비스 언로드 (및 비활성화)
launchctl unload -w ~/Library/LaunchAgents/com.example.nginx.plist
어때요? launchctl
명령어를 사용하니 brew services
보다 훨씬 더 직접적으로 서비스를 제어하는 느낌이 들지 않나요? 😎 이걸 활용하면 brew
로 설치하지 않은 프로그램이나 직접 만든 스크립트도 얼마든지 launchd
로 관리할 수 있답니다!

초보자를 위한 launchd 문제 해결 꿀팁
launchd를 처음 사용하다 보면 예상치 못한 문제에 부딪힐 수 있어요. 🥺 하지만 걱정 마세요! 몇 가지 흔한 문제 유형과 해결 팁을 알면 금방 해결할 수 있답니다. 같이 살펴볼까요?
- plist 파일 오류: 가장 흔한 문제 중 하나예요! XML 문법 오류가 있거나, 키 이름 오타, 잘못된 값 유형 등이 원인일 수 있어요.
- 해결 팁: 터미널에서 plutil -lint [plist 파일 경로] 명령어를 사용하면
plist
파일의 문법 오류를 확인할 수 있어요. “OK”가 나오면 일단 문법은 통과! ✅
- 해결 팁: 터미널에서 plutil -lint [plist 파일 경로] 명령어를 사용하면
- 경로 및 권한 문제: ProgramArguments에 지정한 프로그램 경로가 잘못되었거나, 해당 프로그램을 실행할 권한이 없는 경우 작업이 실패할 수 있어요. 특히 스크립트를 실행할 때는 실행 권한(chmod +x)이 있는지 꼭 확인해야 해요.
- 해결 팁:
plist
파일에 적은 경로가 정확한지 다시 한번 확인하고, 터미널에서 직접 해당 명령어를 실행해 보세요. 권한 오류가 발생한다면 chmod 명령어로 권한을 조정하거나, 필요하다면 sudo launchctl을 사용해야 할 수도 있어요. (단, sudo 사용은 신중하게!)
- 해결 팁:
- 작업이 실행되지 않거나 바로 종료되는 경우:
plist
파일 자체에는 문제가 없는데도 작업이 제대로 실행되지 않는 경우가 있어요. 프로그램 자체의 오류일 수도 있고,launchd
설정 문제일 수도 있답니다.- 해결 팁: macOS의 콘솔(Console.app) 앱을 열어보세요! 💻 콘솔 앱에서 시스템 로그를 실시간으로 확인할 수 있는데, 여기에 launchd 관련 오류 메시지나 실행하려던 프로그램이 출력하는 에러 메시지가 기록되어 있을 가능성이 높아요. 로그를 잘 살펴보면 문제의 단서를 찾을 수 있을 거예요! 또한, StandardOutPath와 StandardErrorPath키를
plist
파일에 추가하여 프로그램의 출력과 오류 메시지를 특정 파일에 기록하도록 설정하면 디버깅에 큰 도움이 된답니다.
- 해결 팁: macOS의 콘솔(Console.app) 앱을 열어보세요! 💻 콘솔 앱에서 시스템 로그를 실시간으로 확인할 수 있는데, 여기에 launchd 관련 오류 메시지나 실행하려던 프로그램이 출력하는 에러 메시지가 기록되어 있을 가능성이 높아요. 로그를 잘 살펴보면 문제의 단서를 찾을 수 있을 거예요! 또한, StandardOutPath와 StandardErrorPath키를
문제가 생겼을 때 당황하지 말고, 차근차근 원인을 찾아 해결해나가면 launchd 전문가로 거듭날 수 있을 거예요! 💪
결론 및 요약
오늘은 brew 사용자분들을 위해 macOS의 강력한 백그라운드 작업 관리자인 launchd에 대해 알아보았습니다. brew services
가 편리하긴 하지만, 더 세밀한 제어가 필요할 때 왜 launchd가 필요한지, 그리고 launchd를 움직이는 핵심 설계도인 plist
파일의 기본 구조와 작성법, 마지막으로 launchctl
명령어를 이용해 직접 작업을 관리하는 방법까지 살펴보았죠. 처음에는 조금 낯설 수 있지만, 이제 여러분은 launchd
를 이용해 원하는 프로그램을 원하는 방식으로 자동 실행하고 관리할 수 있는 기본적인 지식을 갖추게 되셨을 거예요! 🎉 plist
파일 오류나 권한 문제 같은 초보자가 겪을 수 있는 문제와 해결 팁까지 알게 되었으니, 이제 웬만한 문제는 스스로 해결하실 수 있을 겁니다!
오늘 배운 내용을 바탕으로 launchd를 잘 활용하셔서 여러분의 맥 사용 경험을 더욱 풍부하고 효율적으로 만들어보시길 바랍니다! 😊 launchd에는 오늘 다룬 내용 외에도 특정 시간에 작업을 예약하거나, 특정 디렉토리를 감시하는 등 더욱 강력하고 흥미로운 기능들이 많으니, 앞으로 더 탐구해보는 것도 기대하시면 좋겠어요! 다음에 또 유익하고 재미있는 정보로 찾아올게요! 👋
“macOS 자동 실행의 숨은 강자, launchd 완벽 정복 가이드 (brew 사용자 필독!)”에 대한 1개의 생각