yetnoneの日記

どこぞのPh.D. student。何をやっているかと聞かれると困る。

コマンド一発でリモートのJupyterをローカルで開く

  1. ssh先のJupyterをローカルで開けるようにする
  2. sshオプションをコンフィグ化、コマンドを1つにまとめる

1. ssh先のJupyterをローカルで開けるようにする

まずはリモートでJupyterの設定。

Running a notebook server — Jupyter Notebook 5.1.0.dev documentation

後は(最初の方は上と被っているが)以下を参照。

coderwall.com

これで、以下の流れでJupyterのフォワーディングができる。

$ ssh ホスト名
> jupyter notebook &
(別のウィンドウで)
$ ssh -N -f -L ローカルでのポート番号:localhost:JUPYTERで設定したポート番号 ホスト名
(ブラウザを開いて "http://localhost:ローカルでのポート番号" にアクセス)

2. sshオプションをコンフィグ化、コマンドを1つにまとめる

以下Mac環境。まずはsshのコンフィグ化。LocalCommandで自動的にローカルのブラウザを開くようにしてある。

Host jupyter                                                                                                           
    HostName ホスト名
    LocalForward ローカルでのポート番号 localhost:JUPYTERで設定したポート番号
    User ユーザ名
    IdentityFile 秘密鍵
    ServerAliveInterval 60
    ProxyCommand ssh -W %h:%p 経由ホスト名
    PermitLocalCommand yes
    LocalCommand open -a "/Applications/Google Chrome.app" http://localhost:ローカルでのポート番号

そして、sshした後にリモートでJupyterを起動してくれるようなエイリアス.bash_profileに追加。

alias jupyter_remote='ssh jupyter "source ~/.bash_profile; jupyter notebook &" &'

これで、ローカルで$ jupyter_remoteとするだけでリモートのJupyterをローカルブラウザで開けるようになった。

ただ現時点で2つ問題点が残っている。

  1. 作業が終わってsshを切ってもリモートのJupyterは実行し続け、プロセスは残りポートを解放しない。幸いその次の起動からは勝手に他のポートを使ってくれるため、何もしなくても何回でも使い続けることは可能だが、定期的にログインしてプロセスを殺してやらないとゴミプロセス達が溜まる一方となってしまう。なので、ssh切断時にプロセスもkillしてくれるようにしたい。

  2. なぜか(Jupyter関連のゴミプロセスが無い状態での)最初の一発だけはchannel *: open failed: connect failed: Connection refusedとなってしまう。1回これを食らってからもう一回$ jupyter_remoteすると大丈夫。

これらの問題をうまく解決できる方法をご存知の方がいたら教えてください。。