
SNS를 무의미하게 보지 않기 위해 launchd로 매일 아침 AI 뉴스 요약을 자동 생성하기
요약
macOS의 launchd를 활용하여 매일 아침 AI 뉴스 요약을 자동으로 생성하는 워크플로우를 구축하는 방법을 소개합니다. SNS의 정보 과잉을 피하고, 자신만의 프롬프트를 통해 주도적으로 정보를 수집하는 자동화 가이드를 제공합니다.
핵심 포인트
- macOS 표준 기능인 launchd를 사용하여 정기적인 작업 자동화
- claude CLI 또는 bob을 활용한 AI 뉴스 요약 생성
- RunAtLoad와 StartCalendarInterval 설정을 통한 실행 제어
- plist 파일을 이용한 스크립트 없는 자동화 구현
AI 뉴스는 챙겨보고 싶지만, 스마트폰의 뉴스 앱이나 Twitter/X를 보러 가면 나도 모르게 관련 없는 것들까지 계속 보게 됩니다.
뉴스 사이트도 앱도 SNS도, 기본적으로는 "더 많이 보게 만드는" 방향으로 만들어져 있습니다. 스스로 정보를 수집하고 있다고 생각해도, 정신을 차려보면 흘러나오는 정보를 수동적으로 받아들이고 있을 때가 많습니다.
그것을 조금이라도 피하고 싶어서, 자신의 취향에 맞춘 프롬프트(Prompt)로 AI 뉴스 요약을 매일 아침 생성하고, 그것을 읽으면 다른 것은 보지 않는다는 운용 방식을 시도해 보기로 했습니다.
정보 수집의 주도권을 조금 이쪽으로 가져오는 이미지입니다.
처음에는 "정기 실행이라고 하면 cron인가?"라고 생각해서 AI에게 물어보았지만, macOS에는 표준으로 launchd가 들어있어서 이번 용도에는 그쪽이 더 좋아 보였습니다.
하고 싶은 일은 간단합니다.
- 매일 1회, AI 뉴스 요약을 Markdown으로 생성한다
- Mac이 슬립(Sleep) 중이라면, 복귀 후에 실행되면 된다
- 가능한 한 macOS 표준 기능만으로 해결한다
.sh파일은 만들지 않고, plist만으로 해결한다 - 약간의 중복이나 누락은 허용한다
이번에는 bob을 사용하고 있지만, 비슷한 CLI라면 claude -p로도 가능합니다.
예를 들어 수동이라면 이런 느낌입니다.
bob --approval-mode=auto_edit -p "24시간 이내에 발표된 AI에 관한 뉴스에 대해 짧게 URL과 함께 정리해줘" > test.md
claude -p를 사용한다면 이미지는 다음과 같습니다.
claude -p "24시간 이내에 발표된 AI 뉴스를 짧게 URL과 함께 정리해줘" > test.md
이 기사의 예시에서는 Volta 하위의 $HOME/.volta/bin/bob을 사용하고 있습니다. 이 부분은 자신의 환경에 맞는 bob이나 claude의 경로로 바꿔주세요.
macOS 표준으로 정기 실행하려면 launchd를 사용합니다.
Linux 서버의 감각으로는 cron이 먼저 떠오르겠지만, macOS에서는 launchd가 표준 메커니즘으로 준비되어 있습니다. 로그인 시에 동작시키거나, 지정된 시각에 동작시키는 용도라면 우선 이것을 살펴보는 것이 좋습니다.
이번에 사용한 것은 이 두 가지입니다.
RunAtLoad
StartCalendarInterval
RunAtLoad는 로그인 시나 LaunchAgent의 로드 시에 실행됩니다.
StartCalendarInterval은 지정된 시각에 실행됩니다. 지정된 시각에 Mac이 슬립(Sleep) 상태였다면, 다음에 깨어나는 타이밍에 1회 실행됩니다. 며칠 동안 슬립 상태였다고 해도, 복귀 시에 여러 번 모아서 실행되는 것이 아니라 1회로 합쳐지는 것 같습니다.
제 용도에는 이것으로 충분했습니다. Mac을 자동으로 깨우기까지 하면서 실행하고 싶은 것은 아니니까요.
~/Library/LaunchAgents/com.example.ai-news.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">
...
XML 내부이므로, &&는 &&, >는 >로 작성했습니다.
claude -p를 사용하는 경우에는 커맨드 부분을 예를 들어 다음과 같이 바꿉니다.
claude -p "24시간 이내에 발표된 AI 뉴스를 짧게 URL과 함께 정리해줘"
처음에는 "24시간 이내의 AI 뉴스를 짧게 URL과 함께 정리해줘" 정도면 충분하다고 생각합니다.
다만, 제 경우에는 한동안 시도해 보면서 다음과 같은 방향으로 개선하고 싶어졌습니다.
- URL은 본문 중에 흩뿌리지 않고 마지막에 모은다
- 테마별로 나눈다
- "사실"과 "보이는 의견·논점"을 나눈다
- 최초 또는 지난 실행 시각을 알 수 없는 경우에는 과거 1주일을 상한으로 한다
news/에 있는 과거 md 파일명이나 timestamp도 확인하여 지난 실행을 추정한다
뉴스 앱이나 SNS는 기본적으로 상대방의 편의에 따라 나열됩니다. 이 부분을 내가 읽고 싶은 형태로 맞출 수 있다는 것이 이 운영 방식의 장점이라고 생각합니다.
저장 위치를 만듭니다.
mkdir -p ~/Library/LaunchAgents ~/ai-news/news
plist를 배치하여 등록합니다.
cp ~/ai-news/launchd/com.example.ai-news.plist ~/Library/LaunchAgents/
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.ai-news.plist
launchctl enable gui/$(id -u)/com.example.ai-news
바로 테스트하려면 kickstart를 합니다.
launchctl kickstart -k gui/$(id -u)/com.example.ai-news
Could not find service "com.example.ai-news"가 나오는 경우에는 아직 bootstrap되지 않은 상태입니다. 먼저 등록이 필요합니다.
생성되는 파일은 다음과 같은 형태입니다.
~/ai-news/news/YYYY-MM-DD_HHMM_ai-news.md
등록 상태는 이것으로 확인할 수 있습니다.
launchctl print gui/$(id -u)/com.example.ai-news
표준 GUI에서 LaunchAgent 목록을 깔끔하게 볼 수 있는 화면은 별로 없는 것 같았습니다. 시스템 설정의 로그인 항목에 일부 나타나기도 하지만, 확실하게 확인하려면 CLI가 좋을 것 같습니다.
중단만 하려면 bootout을 합니다.
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.example.ai-news.plist
삭제할 경우에는 중단한 뒤에 plist를 삭제합니다.
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.example.ai-news.plist
rm ~/Library/LaunchAgents/com.example.ai-news.plist
이제 막 운영을 시작했을 뿐이지만, '뉴스를 보러 가는' 것이 아니라 '나에게 맞춰 정제된 뉴스만 읽는' 형태로 바꾸면, 무의미하게 정보를 받아들이는 시간을 줄일 수 있을 것 같다는 느낌이 듭니다.
물론 이것으로 모든 뉴스를 망라할 수는 없습니다. 약간의 중복이나 누락은 발생합니다. 다만, 저의 경우에는 완벽한 뉴스 수집보다는 수동적으로 SNS를 계속 보고 있지 않는 것이 더 중요했습니다.
당분간 사용해 보면서 프롬프트(Prompt)나 출력 형식을 조정해 나갈 계획입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기