launchctl 사용법: 맥OS에서 서비스 등록하기
주피터 노트북을 서비스로 등록하기

들어가며

매일 같이 사용하는 프로그램은 항상 실행되어있기 마련입니다. 그래서 사용자들은 이러한 애플리케이션들을 시작 프로그램에 등록해 놓고 사용합니다. 이렇게 매일 같이 사용하는 애플리케이션이 백그라운드에서 동작하는 서버라면 어떻게 해야할까요? 매번 터미널을 열어서 실행하는 것은 여간 번거로운 일이 아닙니다. 맥OSmacOS에서는 커스텀 서비스로 등록해 이러한 번거로움을 피해갈 수 있습니다. 이 글에서는 주피터 노트북Jupyter Notebook을 예제로 맥OS 서비스 등록과 간단한 조작법에 대해서 살펴봅니다.

44BITS 소식과 클라우드 뉴스를 전해드립니다. 지금 5,000명 이상의 구독자와 함께 하고 있습니다 📮

주피터 노트북(Jupyter Notebook) 서비스 등록 예제

이 글에서는 주피터 노트북을 예제로 맥OS의 서비스 등록 방법을 소개합니다. 아이파이썬IPython은 파이썬Python REPL의 확장으로 웹 기반의 노트북을 지원합니다. 이 애플리케이션은 서버로 동작하는데, 데스크탑에서 사용하는 경우 매번 서버를 실행해줘야하는 번거로움이 있습니다. 여기서는 로컬 환경에서 실행되는 주피터 노트북을 서비스로 만들어서 항상 http://localhost:8888로 접근 가능하도록 만들어보겠습니다.

주피터 노트북(Jupyter Notebook) 준비하기

먼저 주피터 노트북을 사용가능한 환경을 준비합니다. 맥OS 상에 기본적으로 설치된 파이썬을 사용하거나, 필요하다면 pyenv 등을 이용해 직접 적절한 환경을 구축합니다. 파이썬 3 이상, 아이파이썬 3 이상 버전을 추천합니다.

$ brew install zeromq
$ pip install ipython[notebook]
$ ipython notebook
[I 01:30:10.061 NotebookApp] Using MathJax from CDN: https://cdn.mathjax.org/mathjax/latest/MathJax.js
[I 01:30:10.117 NotebookApp] Serving notebooks from local directory: /Users/toto/Library/LaunchAgents
[I 01:30:10.118 NotebookApp] 0 active kernels
[I 01:30:10.118 NotebookApp] The IPython Notebook is running at: http://localhost:8888/
[I 01:30:10.118 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

이제 localhost:8888로 노트북 서버에 접근가능합니다.

주피터 노트북에 접속한 화면
주피터 노트북에 접속한 화면

런치 에이전트(LaunchAgent) 서비스 파일 준비하기

먼저 ~/Library 디렉터리 아래에 LaunchAgents 디렉터리가 있는 지 확인합니다. 그리고 com.jupyter.server.plist 파일을 생성해줍니다.

$ mkdir -p ~/Library/LaunchAgents/
$ touch com.jupyter-python3.server.plist

com.jupyter.server.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>KeepAlive</key>
    <true />
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.jupyter.server</string>
    <key>ProgramArguments</key>
    <array>
      <string>/your/ipython/path</string>
      <string>notebook</string>
      <string>--ip=0.0.0.0</string>
      <string>--port=8888</string>
      <string>--notebook-dir=/your/notebook/path</string>
    </array>
  </dict>
</plist>

이 설정에서 /your/ipython/path/your/notebook/path는 직접 자신이 사용하는 디렉터리로 지정해야한다. /your/ipython/pathwhich ipython 명령어로 위치를 확인할 수 있고, your/notebook/path는 앞으로 작성하게 될 노트북을 디렉터리를 원하는 곳에 생성하고 그 경로를 지정해줍니다.

다음 명령어로 서비스를 등록(load)합니다.

$ launchctl load ~/Library/LaunchAgents/com.jupyter.server.plist

단, launchctltmux와 같은 터미널 멀티플렉서 환경에서는 정상적으로 실행되지 않는 경우가 있으니, 기본 터미널에서 실행하는 것을 추천드립니다. 여기까지 정상적으로 설정했다면 이제 시스템이 실행될 때 자동적으로 서비스를 실행할 것입니다.

서비스 실행하기

$ launchctl start com.jupyter.server

위 설정의 경우, RunAtLoad 키를 통해서 로드 시에 서비스를 자동 실행합니다. 필요한 경우 launchctl을 통해서 직접 서비스를 실행할 수도 있습니다. 서비스를 실행하면 웹페이지가 직접 기본 브라우저로 실행됩니다. 그렇지 않다면 웹브라우저에서 http://localhost:8888로 접근할 수 있습니다.

서비스 중지하기

$ launchctl stop com.jupyter.server

launchctl을 통해서 서비스를 중지할 수 있습니다. 단, 위와 같이 KeepAlive가 설정되어 있으면 종료되도 다시 실행됩니다. 완전히 자동으로 실행되지 않게 하려면 unload 후 서비스 파일을 삭제해야합니다.

결론

이 글에서는 주피터 노트북Jupyter Notebook을 서비스로 등록해서 사용하는 법에 대해서 살펴보았습니다. 하지만 서비스 파일의 기본적인 구조만 익혀둔다면, 이외에도 다양한 서비스들을 직접 정의해서 편리하게 사용할 수 있을 것입니다. 더불어 맥OS의 서비스는 실행 상태 유지(<key>KeepAlive</key>), 로드 시 실행하기(<key>RunAtLoad</key>), 반복 실행(<key>StartInterval</key>), 표준 출력(<key>StandardOutPath</key>), 표준 에러(<key>StandardErrorPath</key>) 리다이렉트 등 더 다양한 설정들도 지원합니다. 자세한 내용은 다음 페이지를 참조하기 바랍니다.

Peco 사용법: 커맨드라인 텍스트 증분검색 필터링 도구

🗒 기사, 2015-12-09 - 페코(peco)는 커맨드라인 인터페이스에서 입력받은 텍스트 데이터에 대해서 증분검색을 수행하는 도구입니다. 페코는 파일 탐색이나 다른 프로세스의 출력 결과를 탐색하는 데 도움이 될 뿐만 아니라 셸의 사용성을 개선하는 데도 큰 도움이 됩니다. 이 글에서는 페코의 기본적인 사용법과 셸에서 입력한 명령어 히스토리를 증분검색으로 탐색하는 방법을 소개합니다.

루비(Ruby): 블록, Proc 객체, 람다 함수의 차이

🗒 기사, 2015-12-07 - 프로그래밍 언어 루비에서는 블록 문법이 많이 활용됩니다. 블록 문법은 루비의 익명 함수 표현법 중 하나입니다. 루비에는 블록 뿐만아니라 Proc 객체나 lambda 문을 통해서도 익명 함수를 정의할 수 있습니다. 이 글에서는 블록 문법, Proc 객체, 람다 함수의 사용법과 차이에 대해서 소개합니다.

깃허브(GitHub) 에코시스템 - 코드 클라이메이트(Code Climate), 젬나시움(Gemnasium), 트래비스CI(TravisCI), 커버럴스(Coveralls)

🗒 기사, 2013-10-02 - 깃허브 프로젝트와 연동할 수 있는 다양한 서비스들이 존재합니다. 이 글에서는 코드 메트릭스 측정을 위한 코드 클라이메이트, 의존성의 최신 여부를 알려주는 젬나시움, 지속적 통합을 서비스로 제공하는 트래비스CI, 테스트 커버리지 관리를 위한 커버럴스 서비스를 소개합니다.