Skip to content

Instantly share code, notes, and snippets.

@whophil
Forked from doowon/jupyter_systemd
Last active January 17, 2023 03:06
Embed
What would you like to do?
A systemd script for running a Jupyter notebook server.
# After Ubuntu 16.04, Systemd becomes the default.
# It is simpler than https://gist.github.com/Doowon/38910829898a6624ce4ed554f082c4dd
[Unit]
Description=Jupyter Notebook
[Service]
Type=simple
PIDFile=/run/jupyter.pid
ExecStart=/home/phil/Enthought/Canopy_64bit/User/bin/jupyter-notebook --config=/home/phil/.jupyter/jupyter_notebook_config.py
User=phil
Group=phil
WorkingDirectory=/home/phil/Notebooks/
Restart=always
RestartSec=10
#KillMode=mixed
[Install]
WantedBy=multi-user.target
@whophil
Copy link
Author

whophil commented Aug 14, 2016

Following the instructions of https://www.digitalocean.com/community/tutorials/how-to-configure-a-linux-service-to-start-automatically-after-a-crash-or-reboot-part-1-practical-examples, place this file in:

/etc/systemd/system/jupyter.service

Then execute

sudo systemctl enable jupyter.service

Reload the systemd daemona and restart the service

sudo systemctl daemon-reload
sudo systemctl restart jupyter.service

@whophil
Copy link
Author

whophil commented Aug 27, 2016

Ran into some problems with calling jupyter notebook

`'notebook' is not a Jupyter command`.

Switched to explicit jupyter-notebook call instead.

@DomHudson
Copy link

Thanks!

@Kevintso
Copy link

Kevintso commented Dec 4, 2017

why occurs this error, with or without config.py
● jupyter.service
Loaded: loaded (/lib/systemd/system/jupyter.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Mon 2017-12-04 23:38:01 UTC; 3s ago
Process: 17830 ExecStart=/home/ubuntu/anaconda3/envs/tensorflow_p36/bin/jupyter-notebook (code=exited, status=200/CHDIR)
Main PID: 17830 (code=exited, status=200/CHDIR)

@archi18
Copy link

archi18 commented Mar 14, 2018

Hi @Kevintso ,
From exit status (code=exited, status=200/CHDIR) , it seems that either you do not have specified working directory or user and group you have specified does not have right permission in that directory.
Working directory (WorkingDirectory=) must be present , and make sure it has the right permissions.

Hope this helps you.

@WesternGun
Copy link

In my case I have a 203/EXEC error, and after checking this, I have found that I have to add /bin/bash -c before the whole command, so it becomes:

ExecStart=/bin/bash -c "/usr/bin/jupyter notebook --config=/home/westerngun/.jupyter/jupyter_notebook_config.py --debug > /another/programming/jupyter/notebook.log 2>&1"

(last part is for log, you can go without it)

I am with CentOS 7. After this change this service finally gets working. So maybe the OP lacks it?

@aeoleader
Copy link

18.04 won't start the service. After executing `sudo systemctl restart jupyter.service', it gives me Exec format error.

@G-Guillard
Copy link

If encountering the following errors :

 Main PID: 24251 (code=exited, status=1/FAILURE)

Mar 21 13:48:21 ip-172-31-26-72 systemd[1]: jupyter.service: Main process exited, code=exited, status=1/FAILURE
Mar 21 13:48:21 ip-172-31-26-72 systemd[1]: jupyter.service: Unit entered failed state.
Mar 21 13:48:21 ip-172-31-26-72 systemd[1]: jupyter.service: Failed with result 'exit-code'.

Check /var/log/syslog for a more verbose message. It may be that

ValueError: certfile "certs/mycert.pem" does not exist

Solution : use absolute paths in your config file.

@fef1312
Copy link

fef1312 commented Nov 29, 2019

I suggest putting the service file in /etc/systemd/system/, not /usr/lib/systemd/system/. The latter is only for system units installed from the distribution package manager, while the one in /etc is for user-defined ones. It will make no difference in terms of functionality, but prevent conflicts with any package that might happen to install a jupyter.service in the future. Reference: systemd.unit(5)

@whophil
Copy link
Author

whophil commented Dec 19, 2019

Thanks @sandtler, that is a good point - I have updated the instructions in the first comment.

I suggest putting the service file in /etc/systemd/system/, not /usr/lib/systemd/system/. The latter is only for system units installed from the distribution package manager, while the one in /etc is for user-defined ones. It will make no difference in terms of functionality, but prevent conflicts with any package that might happen to install a jupyter.service in the future. Reference: systemd.unit(5)

@JamesCHub
Copy link

JamesCHub commented Nov 11, 2020

If you need environment variables for Tensorflow GPU work, and .bashrc usually does the job for you, you need to somehow make those available to the Jupyter service, or else Notebooks that need the GPU won't be able to see it.

Not sure this is the best way, but it's the way I got it to work:

[Unit]
Description=Jupyter Notebook

[Service]
Type=simple
PIDFile=/run/jupyter.pid
# ------------------------------------
Environment="PATH=/usr/local/cuda-10.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Environment="LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:/usr/local/cuda-10.1/lib64:usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64"
Environment="CUDA_HOME=/usr/local/cuda-10.1"
Environment="NUMBAPRO_NVVM=/usr/local/cuda-10.1/nvvm/lib64/libnvvm.so"
Environment="NUMBAPRO_LIBDEVICE=/usr/local/cuda-10.1/nvvm/libdevice/"

ExecStart=/home/phil/.local/bin/jupyter-notebook
User=phil
Group=phil
WorkingDirectory=/home/phil/z_Notebooks
Restart=always
RestartSec=10
#KillMode=mixed

[Install]
WantedBy=multi-user.target

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment