jupyter notebook 默认不能后台常驻,因其设计为交互式工具,前台运行并绑定终端会话,ssh断开时进程收到sighup信号被终止;需修改ip、open_browser、password三项配置,并用nohup或systemd启动。

能长期后台运行,但默认配置不行,必须改三处关键设置 + 用 nohup 或 systemd 启动,否则关终端就断。
为什么 jupyter notebook 默认不能后台常驻
直接运行 jupyter notebook 会前台阻塞、绑定当前终端 session。一旦 SSH 断开或关闭窗口,进程收到 SIGHUP 信号就被杀掉。这不是 bug,是设计使然——它本就是交互式开发工具,不是服务程序。
- 不加任何参数启动,
jupyter notebook会尝试打开本地浏览器,且监听127.0.0.1:8888,外部根本连不上 -
--allow-root不是万能钥匙:它只绕过 root 用户限制,不解决后台存活问题 - 单纯加
&(后台运行)没用:终端退出后照样挂,因为没处理信号和输出重定向
必须修改的三个核心配置项
编辑 ~/.jupyter/jupyter_notebook_config.py,在文件开头插入以下内容(顺序无关,但建议集中放):
-
c.NotebookApp.ip = '0.0.0.0':别用'*',部分新版本会报错;'0.0.0.0'明确表示监听所有 IPv4 接口 -
c.NotebookApp.open_browser = False:禁用自动弹浏览器,避免因无图形环境卡住 -
c.NotebookApp.password = 'sha1:xxx...':必须用哈希密码,不能写明文;生成方式见下一条 - 可选但推荐:
c.NotebookApp.port = 8888(或你指定的端口),c.NotebookApp.allow_remote_access = True(部分 6.x+ 版本需要显式开启)
密码哈希生成方法(Python 3.8+):
python3 -c "from notebook.auth import passwd; print(passwd())"
输入两次密码,复制输出的完整字符串(形如 'sha1:abcd1234:ef567890...'),粘贴到配置里,前后保留单引号。
真正让服务长期存活的启动方式
两种可靠方式,按场景选:
-
临时/测试用:nohup + &
执行:nohup jupyter notebook --no-browser > jupyter.log 2>&1 &
注意:--no-browser是命令行参数,优先级高于配置文件里的open_browser;日志重定向必须写全,否则 stdout/stderr 仍可能触发挂起 -
生产/开机自启:用 systemd(Linux)或 Windows 服务(Windows)**
Linux 示例(新建/etc/systemd/system/jupyter.service):[Unit] Description=Jupyter Notebook After=network.target [Service] Type=simple User=your_username WorkingDirectory=/home/your_username ExecStart=/home/your_username/miniconda3/bin/jupyter notebook --config=/home/your_username/.jupyter/jupyter_notebook_config.py Restart=always RestartSec=10 [Install] WantedBy=multi-user.target
然后:
sudo systemctl daemon-reload && sudo systemctl enable jupyter && sudo systemctl start jupyter
容易被忽略的防火墙和端口转发细节
即使服务跑起来了,外网也未必能访问,常见堵点:
- 云服务器(如阿里云、AWS)安全组必须放行你设的端口(如 8888),光开 Linux 防火墙
ufw不够 - 本地连接远程服务器时,别直连服务器公网 IP:用 SSH 端口转发更安全,例如:
ssh -L 8888:localhost:8888 user@server_ip,然后浏览器访问http://localhost:8888 - 如果服务器在内网(如公司局域网),需确认路由器是否做了端口映射,且目标机器的 Windows/Linux 防火墙允许该端口入站
最后提醒一句:配置文件里写的 c.NotebookApp.password 是哈希值,不是原始密码;jupyter notebook password 命令生成的是 JSON 文件,但新版(7.0+)已默认使用 jupyter_server_config.json,而 notebook 仍读 jupyter_notebook_config.py ——两者不互通,别混用。











