Canvas 1 Layer 1

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

들어가며

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

주피터 노트북(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>) 리다이렉트 등 더 다양한 설정들도 지원합니다. 자세한 내용은 다음 페이지를 참조하기 바랍니다.