2008년 5월 20일 화요일

Mac에서 정해진 시간에 자동으로 프로그램 실행하는 법

애플은 Mac OS X v10.4 Tiger에서부터 launchd라는 프로그램을 사용하기 시작했다. launchd는 애플이 개발하여 공개한 open source service management framework으로 전통적인 유닉스에서 사용되는 /etc/rd, cron, xinetd, init.d의 기능을 통합해서 제공해준다.
좀 더 자세한 소개는 애플 사이트의 Getting started with launchd 를 참조하면 된다.

여기서는 launchd의 다양한 기능들 중에 cron을 대치하는 기능을 설정하는 법을 설명하겠다.

launchd를 제어하기 위해서는 launchctl을 이용하면 된다.
xml로 된 configuration파일을 작성해서 .plist 확장자를 붙인 다음 해당 디렉토리에 저장해준다.
관리자가 아닌 경우 자신의 홈 디렉토리(~) 아래의 Library/LaunchAgents 에 저장해주면 된다.

* 각각의 경우에 따른 .plist 파일 저장 위치
     ~/Library/LaunchAgents         Per-user agents provided by the user.
/Library/LaunchAgents Per-user agents provided by the administrator.
/Library/LaunchDaemons System wide daemons provided by the administrator.
/System/Library/LaunchAgents Mac OS X Per-user agents.
/System/Library/LaunchDaemons Mac OS X System wide daemons.

.plist 파일의 상세한 내용은 애플 사이트의 man pages 를 참조하면 된다.

여기서는 일단 간단한 예로 설명하기로 하겠다.

$ /usr/bin/python /Users/abcd/bin/checkmail.py

위의 명령을 1분(60초)마다 한번씩 실행해서 메일이 왔는지 확인하고 싶은 경우

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>check_mail</string>
<key>OnDemand</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/python</string>
<string>/Users/abcd/bin/checkmail.py</string>
</array>
<key>StartInterval</key>
<integer>60</integer>
</dict>
</plist>

---
실행할 명령에 argument가 없으면

<key>ProgramArguments</key>
<array>
<string>프로그램 이름</string>
</array>

같이 해 주면 되지만 argument가 있는 경우 각각의 argument를 다음과 같이 별개의 element로 구분해서 넣어줘야 한다.

<key>ProgramArguments</key>
<array>
<string>프로그램 이름</string>
<string>argument 1</string>
<string>argument 2</string>
....
</array>

<key>StartInterval</key>
<integer>시간간격(초)</integer>

빨간색 부분은 Tiger(v10.4)에서만 사용할 수 있고 Leopard(v10.5)에서는 저 부분을 아래와 같이 바꿔줘야 한다.

<key>KeepAlive</key>
<false/>
---

위의 내용을 ~/Library/LaunchAgents 에 check_mail.plist 라는 이름으로 저장한 경우 터미널을 열고

$ launchctl load ~/Library/LaunchAgents/check_mail.plist

를 쳐 주거나 맥을 재부팅 시키면 바뀐 내용이 적용된다.

지금까지 설명한 방식은 전통적인 유닉스 환경에서 vi를 사용하는 방식이고 사용자 편의성을 최고로 생각하는 맥OS답게 이미 사용자가 쉽게 launchd configuration을 만들거나 수정할 수 있는 어플리케이션도 나와 있다.

사용자 삽입 이미지

Lingon은 launchd의 configuration파일을 에디팅하거나 만들어주는 소프트웨어로 xml이나 plist의 문법을 몰라도 손 쉽게 launchd를 설정할 수 있게 해 준다. 물론 오픈소스 소프트웨어로 여기에서 다운받을 수 있다.
위에 보이는 화면은 베이직 모드로 일반적인 설정을 손 쉽게 할 수 있게 해 주는 모드고 전문가 모드에서는 텍스트 입력 화면에서 각 xml element를 직접 쳐 넣을 수 있다.

댓글 1개:

  1. trackback from: Mac OS X에서 요일 지정하여 주기적으로 무언가 실행하기
    Mac OS X에서는 유닉스/리눅스 계열에서 흔히 쓰는 cron 대신 launchd라는 것으로 주기적으로 실행되는 명령을 콘트롤한다. launchd에 대한 일반적인 사항은 Mac에서 정해진 시간에 자동으로 프로그램 실행하는 법이라는 포스트를 보면 알 수 있다. 소개한 포스트에서 볼 수 있듯이, 직접 plist 파일을 수정하는 것보다는 Lingon이라는 오픈소스 도구를 사용하는 것이 편리하다. 그런데 cron에서는 쉽게 설정할 수 있는 "매주 월, 화..

    답글삭제