【番外編】CentOSにPythonの機械学習開発環境を構築する（systemdでのJupyter Notebookの自動起動編）

# 前書き
[【第一回】CentOSにPythonの機械学習開発環境を構築する（Anacondaインストール編）](https://qiita.com/yasushi-jp/items/7cef8447062fb7dd200c "【第一回】CentOSにPythonの機械学習開発環境を構築する（Anacondaインストール編）")
[【第二回】CentOSにPythonの機械学習開発環境を構築する（Jupyter Notebook編）](https://qiita.com/yasushi-jp/items/d06efa771af7a0d8921d "【第二回】CentOSにPythonの機械学習開発環境を構築する（Jupyter Notebook編）")
[【第三回（最終回）】CentOSにPythonの機械学習開発環境を構築する（Tensorflow + Kerasインストール編）](https://qiita.com/yasushi-jp/items/142ab93290ad2f07b4c0 "【第三回（最終回）】CentOSにPythonの機械学習開発環境を構築する（Tensorflow + Kerasインストール編）")
で、機械学習の開発環境を作成しました。
今回の番外編で、**Jupyter Notebook**を**systemd**のサービスとして登録し、`systemctl`コマンドで起動、停止、及び自動起動をさせる手順を紹介したいと思います。

# 環境
+ OS：CentOS Linux release 7.7.1908

# 前提条件
+ **CentOS**に**Anaconda3**（`Anaconda3-2019.07-Linux-x86_64.sh`）がインストールされていること
+ 機械学習用の環境（ml_env）が作成されていること

（[「【第一回】CentOSにPythonの機械学習開発環境を構築する（Anacondaインストール編）」](https://qiita.com/yasushi-jp/items/7cef8447062fb7dd200c "【第一回】CentOSにPythonの機械学習開発環境を構築する（Anacondaインストール編）")で紹介）

+ **Jupyter Notebook**を使用可能な設定が完了していること

（[「【第二回】CentOSにPythonの機械学習開発環境を構築する（Jupyter Notebook編）」](https://qiita.com/yasushi-jp/items/d06efa771af7a0d8921d "【第二回】CentOSにPythonの機械学習開発環境を構築する（Jupyter Notebook編）")で紹介）

# 手順
### 1. Jupyterのパスを確認
`anaconda`ユーザーでログインまたはスイッチします。
`su - anaconda`

```console:コマンド実行結果
[root@CENTOS7 ~]# su - anaconda
最終ログイン: 2019/10/21 (月) 18:24:38 JST日時 pts/0
[anaconda@CENTOS7 ~]$
```

環境設定ファイル`.anaconda.env`を読み込みます。
source ./.anaconda.env

```console:コマンド実行結果
[anaconda@CENTOS7 ~]$ source ./.anaconda.env
[anaconda@CENTOS7 ~]$
```

機械学習用環境`ml_env`をアクティブにします。
`conda activate ml_env`

```console:コマンド実行結果
[anaconda@CENTOS7 ~]$ conda activate ml_env
(ml_env) [anaconda@CENTOS7 ~]$
```

Jupyterの実行ファイルのパスを確認します。
`which jupyter`

```console:コマンド実行結果
(ml_env) [anaconda@CENTOS7 ~]$ which jupyter
~/anaconda3/envs/ml_env/bin/jupyter
(ml_env) [anaconda@CENTOS7 ~]$
```

`ml_env`の`jupyter`の実行ファイルのパスが`/home/anaconda//anaconda3/envs/ml_env/bin/jupyter`であることがわかります。

### 2. Unit定義ファイルの作成
`root`ユーザーにスイッチします。
`su -`

```console:コマンド実行結果
(ml_env) [anaconda@CENTOS7 ~]$ su -
パスワード:
最終ログイン: 2019/10/21 (月) 18:43:05 JST 192.168.0.2から開始日時 pts/0
[root@CENTOS7 ~]#
```

`/etc/systemd/system/`配下に`jupyter-notebook.service`ファイルを作成します。

```bash:/etc/systemd/system/jupyter-notebook.service
[Unit]
Description=Jupyter Notebook

[Service]
User=anaconda
Group=anaconda
Type=simple
PIDFile=/var/run/jupyter-notebook.pid
ExecStart=/home/anaconda/anaconda3/envs/ml_env/bin/jupyter notebook
WorkingDirectory=/home/anaconda/work
Restart=always

[Install]
WantedBy = multi-user.target
```

+ User：Jupyter（Anaconda3）のユーザー名を指定
+ Group：Jupyter（Anaconda3）のグループ名を指定
+ ExecStart：`ml_env`での`jupyter notebook`コマンドのフルパスを指定
+ WorkingDirectory：`jupyter notebook`のワーキングディレクトリを指定


### 3. systemdの登録確認
Unit定義ファイルが登録されていることを確認します。
`systemctl list-unit-files --type=service | grep jupyter-notebook`

```console:コマンド実行結果
[root@CENTOS7 ~]# systemctl list-unit-files --type=service | grep jupyter-notebook
jupyter-notebook.service                      disabled
[root@CENTOS7 ~]#
```

### 4. `jupyter-notebook`の自動起動設定
`jupyter-notebook`のステータスを`enable`にします。
`systemctl enable jupyter-notebook`

```console:コマンド実行結果
[root@CENTOS7 ~]# systemctl enable jupyter-notebook
Created symlink from /etc/systemd/system/multi-user.target.wants/jupyter-notebook.service to /etc/systemd/system/jupyter-notebook.service.
[root@CENTOS7 ~]#
```

`jupyter-notebook`のステータスが`enable`になっていることを確認します。
`systemctl list-unit-files --type=service | grep jupyter-notebook`

```console:コマンド実行結果
[root@CENTOS7 ~]# systemctl list-unit-files --type=service | grep jupyter-notebook
jupyter-notebook.service                      enabled
[root@CENTOS7 ~]#
```

### 5. `systemctl`コマンドで`jupyter-notebook`を起動
`systemctl`コマンドで`jupyter-notebook`を起動します。
`systemctl start jupyter-notebook`

```console:コマンド実行結果
[root@CENTOS7 ~]# systemctl start jupyter-notebook
[root@CENTOS7 ~]#
```

`jupyter-notebook`が起動していることを確認します。
`ps -ef | grep jupyter-notebook`

```console:コマンド実行結果
[root@CENTOS7 ~]# ps -ef | grep jupyter-notebook
anaconda  1442     1  0 19:17 ?        00:00:00 /home/anaconda/anaconda3/envs/ml_env/bin/python /home/anaconda/anaconda3/envs/ml_env/bin/jupyter-notebook
root      1459  1370  0 19:21 pts/0    00:00:00 grep --color=auto jupyter-notebook
[root@CENTOS7 ~]#
```

### 6. `systemctl`コマンドで`jupyter-notebook`を停止
`systemctl`コマンドで`jupyter-notebook`を停止します。
`systemctl stop jupyter-notebook`

```console:コマンド実行結果
[root@CENTOS7 ~]# systemctl stop jupyter-notebook
[root@CENTOS7 ~]#```

`jupyter-notebook`が停止していることを確認します。
`ps -ef | grep jupyter-notebook`

```console:コマンド実行結果
[root@CENTOS7 ~]# ps -ef | grep jupyter-notebook
root      1469  1370  0 19:24 pts/0    00:00:00 grep --color=auto jupyter-notebook
[root@CENTOS7 ~]#
```

### 7. OSを再起動後、`jupyter-notebook`が起動していることを確認
OSを再起動します。
`shutdown -r now`

```console:コマンド実行結果
[root@CENTOS7 ~]# shutdown -r now
```

再起動後、`jupyter-notebook`が起動していることを確認します。
`ps -ef | grep jupyter-notebook`

```console:コマンド実行結果
[root@CENTOS7 ~]# ps -ef | grep jupyter-notebook
anaconda   674     1  5 19:27 ?        00:00:02 /home/anaconda/anaconda3/envs/ml_env/bin/python /home/anaconda/anaconda3/envs/ml_env/bin/jupyter-notebook
root      1314  1294  0 19:28 pts/0    00:00:00 grep --color=auto jupyter-notebook
[root@CENTOS7 ~]#
```

以上です。

# 参考サイト
> [10.6. SYSTEMD のユニットファイルの作成および変更](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files "10.6. SYSTEMD のユニットファイルの作成および変更")


# リンク
[【第一回】CentOSにPythonの機械学習開発環境を構築する（Anacondaインストール編）](https://qiita.com/yasushi-jp/items/7cef8447062fb7dd200c "【第一回】CentOSにPythonの機械学習開発環境を構築する（Anacondaインストール編）")
[【第二回】CentOSにPythonの機械学習開発環境を構築する（Jupyter Notebook編）](https://qiita.com/yasushi-jp/items/d06efa771af7a0d8921d "【第二回】CentOSにPythonの機械学習開発環境を構築する（Jupyter Notebook編）")
[【第三回（最終回）】CentOSにPythonの機械学習開発環境を構築する（Tensorflow + Kerasインストール編）](https://qiita.com/yasushi-jp/items/142ab93290ad2f07b4c0 "【第三回（最終回）】CentOSにPythonの機械学習開発環境を構築する（Tensorflow + Kerasインストール編）")