Ubuntu 14.04에 SageMath notebook을 서비스로 실행하기
SageMath 설치
1 2 3 |
sudo apt-add-repository -y ppa:aims/sagemath sudo apt-get update sudo apt-get install sagemath-upstream-binary |
계정 추가
계정 추가하고, notebook 폴더는 계정 사용자들이 모두 접근할 수 있도록 변경
1 2 |
sudo useradd sage sudo usermode sage -s /bin/bash -d /home/sage |
노트북 실행 스크립트 작성
1 2 3 4 |
sudo su - sage mkdir -m 777 /home/sage/notebook.sagenb touch /home/sage/notebook.sagenb/notebook.py chmod 755 /home/sage/notebook.sagenb/notebook.py |
파일은 다음과 같이 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#!/usr/bin/env sage # # @see http://doc.sagemath.org/html/en/reference/notebook/sagenb/notebook/notebook_object.html # # import sage library from sage.all_cmdline import * # Configurable options opts={} # Path to dot_slash. Postfix '.sagenb' will be appended opts['directory']='/home/sage/notebook' # Network interface, port number and secure (SSL) opts['interface']='0.0.0.0' opts['port']=8080 opts['secure']=False # Set False if only admin can register new user #opts['reset']=True #reset admin password opts['accounts']=True opts['automatic_login']=False #opts['upload']= opts['profile']=False # Server control and session timeout opts['server']='twistd' opts['timeout']=0 opts['doc_timeout']=0 # limitations per user # at most 10240MB memory, 10240MB files, 100 processes opts['ulimit']='-v 10240000 -f 10240000 -u 100' # server pool #opts['server_pool']=['sagenb@192.168.0.%s' %n for n in [101..104]] # start Sage Notebook notebook(**opts) |
관리자 계정 비밀번호 입력
1 2 |
cd notebook.sage ./notebook.py |
위 스크립트를 실행하면 관리자 계정 (admin)의 비밀번호를 물어보는데, 입력 후 CTRL+C를 눌러 종료시킴. 서비스로 실행하고 나서는 admin 계정으로 로그인하여 새로운 사용자를 추가한 다음 admin 권한을 주고 admin 계정은 중지시키는 것이 좋음. 여기까지 하면 sage 계정에서 할 일은 끝남. server pool을 사용한다면, ssh 연결을 위해서 인증서를 생성하여 복사해둬야 함.
서비스 등록
/etc/init.d/sagenb 파일을 생성하고 파일 내용을 다음과 같이 작성한다.
1 2 |
sudo touch /etc/init.d/sagenb sudo chmod 755 /etc/init.d/sagenb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#!/bin/sh -e # # start/stop SageMath notebook # ### BEGIN INIT INFO # Provides: # Required-Start: $network # Required-Stop: $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: # Description: # ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/home/sage/notebook.sagenb/notebook.py PIDDIR=/home/sage/notebook.sagenb EXEC=/usr/lib/sagemath/local/bin/python USERID=sage NAME=sagenb DESC="SageMath notebook" test -x $DAEMON || exit 0 . /lib/lsb/init-functions check_root() { if [ "$(id -u)" != "0" ]; then log_failure_msg "You must be root to start, stop or restart $NAME." exit 4 fi } if [ -r /etc/default/$NAME ]; then . /etc/default/$NAME fi # Tasks that can only be run as root if [ "$(id -u)" = "0" ]; then # Check for pid dir if [ ! -d $PIDDIR ] ; then mkdir $PIDDIR fi chown $USERID:$USERID $PIDDIR fi case "$1" in start) check_root exitval=0 log_daemon_msg "Starting $DESC " if pidofproc -p $PIDDIR/$NAME.pid $DAEMON > /dev/null; then log_progress_msg "$NAME apparently already running" log_end_msg 0 exit 0 fi log_progress_msg $NAME start-stop-daemon --start --background --quiet --oknodo --pidfile $PIDDIR/$NAME.pid \ --chuid $USERID:$USERID --name $NAME --exec $DAEMON exitval=$? # # Make pidfile readables for all users (for status to work) [ -e $PIDDIR/$NAME.pid ] && chmod 0644 $PIDDIR/$NAME.pid # Note: Unfortunately, xrdp currently takes too long to create # the pidffile unless properly patched log_end_msg $exitval ;; stop) check_root exitval=0 log_daemon_msg "Stopping $DESC " log_progress_msg $NAME if pidofproc -p $PIDDIR/$NAME.pid $DAEMON > /dev/null; then start-stop-daemon --stop --quiet --oknodo --pidfile $PIDDIR/$NAME.pid \ --exec $EXEC value=$? [ $value -gt 0 ] && exitval=$value else log_progress_msg "apparently not running" fi log_end_msg $exitval ;; restart|force-reload) check_root $0 stop # Wait for things to settle down sleep 1 $0 start ;; reload) log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon" log_warning_msg "cannot re-read the config file (use restart)." ;; status) exitval=0 log_daemon_msg "Checking status of $DESC" "$NAME" if pidofproc -p $PIDDIR/$NAME.pid $DAEMON > /dev/null; then log_progress_msg "running" log_end_msg 0 else log_progress_msg "apparently not running" log_end_msg 1 || true exitval=1 fi exit $exitval ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload|status}" >&2 exit 1 ;; esac exit 0 |
start-stop-daemon 이 리턴되지 않기 때문에 –background 옵션으로 그냥 background 로 실행해버린다. –pid 옵션은 아무 역할을 하지 않지만, 저 위치에 twistd에 의해서 pid가 만들어지기 때문에 종료할 때 사용한다.
서비스 실행확인
서비스의 실행과 종료가 잘 되는지 확인한다.
1 2 3 |
sudo service sagenb start ps -fu sage sudo service sagenb stop |
잘 되면 다음 명령으로 서비스가 부팅될 때 실행되도록 변경한다.
1 |
sudo update-rc.d sagenb defaults 99 |
기타
PEM 연동하는 방법을 찾아봐야겠다.
내 노트북을 계정에 연결하려면.. 게정명은 notebook의 계정명이다. 큰 파일을 업로드하기 번거롭거나 할 때 그냥 쉘에서 복사하거나 링크 걸어서 사용하기 좋음..
ln -s /home/sage/notebook.sagenb/home/게정명 sagenotebook