為了讓jupyterhub 開機啟動,或者以服務的方式啟動,折騰了好久。
環境
ubuntu 16.04
anaconda >= 4.5
python35
jupyterhub 0.9.4
node 6.14.4
jupyterhub 安裝在 conda的虛擬環境中 只有進入該虛擬環境中才能執行jupyterhub命令
建立的指令碼可以啟動jupyterhub
#!/bin/bash -l
conda activate python35
cd /etc/jupyterhub
jupyterhub -f /etc/jupyterhub/jupyterhub_config.py >> /etc/jupyterhub/jupyter.log
bash 一定要加-l
目的是以login shell
的方式登入,否則系統可能無法識別conda
命令,因為conda
4.4後的版本將命令的配置放到了/etc/profile.d/conda.sh
中,只有login shell
登入的時候才會執行該檔案,系統才會識別到conda
命令。大家可能會比較疑惑,為什麼用conda activate
而不用source activate
這樣是不行的,因為我們要放到開機啟動項或者服務啟動項中,這兩種方法識別到的source 是linux系統的source
,就是用來更新檔案狀態的那個命令,通常我們更改系統的配置檔案比如/etc/profile /etc/bash.bashrc
後用source
命令更新,所以在開機啟動或者啟動服務的時候bash 將source
識別成這個更新檔案的命令,導致出錯
每次啟動的上面的指令碼時需要用./name.sh
或者bash name.sh
來執行,且當我們關掉自己的命令行時jupyterhub
服務也就會關掉,也就是沒辦法後台執行。
將上面的指令碼檔案作為開機啟動項,讓其開機自起(只有重啟機器才會生效)
將上面的指令碼作為服務(類似於 ssh server),可以通過service
或systemctl
等服務管理命令控制(不必重啟機器,靈活,可控)
參考鏈結原理比較詳細的鏈結 只要指令碼沒問題,即可執行,但問題是指令碼一旦有問題,服務就不會被啟動,且我們也不知道出錯在哪。比如說,我們不知道該指令碼執行的順序是在載入使用者配置之前還是之後執行,如果在使用者配置path
等配置之前就執行,那麼使用者的某些命令就無法執行比如conda, node configurable-http-proxy
這三個命令都和jupyterhub
相關,如果我們寫的指令碼在載入使用者配置之前就執行,肯定是不行的,所以我們盡量不採用這種方法
我們的機器是ubuntu 16.04
可以中systemctl
管理服務
在/etc/systemd/system/
下建立乙個名為jupyterhub.service
的服務配置檔案,名字是jupyterhub
字尾是.service
,名字可以自己隨便命名,該名字就是以後用systemctl
或service
配置的服務名
在jupyterhub.service
檔案中寫入下面的命令
# default-start: 2 3 4 5
# default-stop: 0 1 6
[unit]
description=jupyterhub (隨便起個名字)
after=syslog.target network.target (在網路服務啟動後啟動該指令碼)
[service]
user=root
execstart=/etc/jupyterhub/jupyterhub.sh (指令碼位址)
[install]
wantedby=default.target
上面的配置是系統服務配置檔案最簡單的寫法改一下就可以了。
在終端中執行systemctl start jupyterhub
啟動服務
檢視服務執行狀態systemctl status jupyterhub
通常會出錯如果提示
node configurable-http-proxy
錯誤,找不到檔案等等,那原因就是服務的優先順序在系統配置之前,也就是我們配置的node
的path
沒有被識別,所以我最終將node
的path
配置放到了/etc/profile
中成功了,之前放到了/etc/bash.bashrc
中並不能識別
服務可以成功啟動,執行systemctl enable jupyterhub
允許開機自啟動
以上就是走過的坑,希望大家在和我一樣的環境下能避免這些坑。
根據jupyterhub 官網的教程我們重新對這個進行了修改,其中我們按照官網修改的內容把服務進行更改,更改的內容如下:
# default-start: 2 3 4 5
# default-stop: 0 1 6
[unit]
description=jupyterhub
after=syslog.target network.target
[service]
user=root
environment="path=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/local/node6.14.4/bin:/usr/bin:/opt/anaconda3/envs/python35/bin"
execstart=/opt/anaconda3/envs/python35/bin/jupyterhub -f /etc/jupyterhub/jupyterhub_config.py
[install]
wantedby=multi-user.target
其中description=jupyterhub
這一行表示你對這個服務起的名字
[service]
下面是重要的資訊
新增environment
一行environment="path=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/local/node6.14.4/bin:/usr/bin:/opt/anaconda3/envs/python35/bin"
conda activate python35 進入該虛擬環境
which jupyterhub 檢視jupyterhub 在哪個路徑下,然後加入到上面的路徑中
這一行,也簡化了,因為採用寫bash
指令碼的方式需要載入conda
,可能是程式執行優先順序的問題,有時候配置的時候會提示我們conda
命名找不到,為了避免這種情況,我們直接用絕對路徑去執行,不需要事先進入conda
虛擬環境,相應的,我們的可執行**變成了下面這樣的
execstart=/opt/anaconda3/envs/python35/bin/jupyterhub -f /etc/jupyterhub/jupyterhub_config.py
這樣就完美解決了,多多點贊支援
Linux上安裝虛擬環境
有時候為了模擬乙個環境需要在一台linux中使用某種版本的庫。例如django需要python3環境下的django1.8版本,但是,進行新的練習,安裝最新版本的django2.0會覆蓋之前的版本,這樣之前用1.8寫的 就有可能不能執行,因此需要設定乙個新的虛擬環境 虛擬環境是真實python環境的...
python虛擬環境配置(上)
嘿,小夥伴們,晚上好呀,我們又見面了,今天又給帶來的是什麼呢,咱們今天就來說一下python的虛擬環境,可能有的小夥伴會疑惑,python的虛擬環境有什麼用呢,我們來一一 一下 我們先來舉個例子,為什麼需要虛擬環境,我們在學習python的時候,可能會學到越來越多的第三方庫,比如爬蟲,我們需要安裝r...
在Ubuntu上建立虛擬環境
ubuntu上建立虛擬開發環境 1.開啟終端 安裝pipsudo apt install python3 pippip install 包名 2.安裝virtualenvsudo pip install virtualenv yvirtualenv 虛擬環境名 指定python直譯器 virtual...