Last updated: 2024/03/05
このページは本研究室のSSHサーバの使用方法を紹介します。このサーバは主にXRAIN粒子判別プログラムを動かすために立てましたが、普段の研究でpython等のプログラムの実行にも自由に使ってください。特にサーバ上ではFALMAとDALMAの波形データをすべて直接アクセスできるので、大量のデータを処理する場合は、サーバ上プログラムを直接実行したほうがデータをダウンロードする必要がないので便利です。(現時点FALMAとDALMAの波形データは100TBぐらいあるので、そもそも全部ダウンロードするのが不可能です)
SSHサーバを使うにはLinuxのほうがずっと簡単ですが、ここはWindowsでの使い方を説明します。サーバを使うには研究室のネットにつながる必要があります。
SSHサーバにアクセスするには無料ソフトWinSCPを使います。
WinSCPを立ち上げて、下図の通りサーバのIPとPort及び与えられたユーサー名とパスワードを入力して、Saveして ("Save password"もチェック)、Loginをクリックしたら、ログインできるはずです。最初にログインする時、"Continue connecting to an unknow ..."というメッセージが出るが、Yesをクリックしてください。
# 次回以降のログインは保存されたサーバ名をクリックするだけでできます。
HOME
フォルダーログインしたら、最初はHOME
フォルダーに入ります (フルパス: /home/username/
)。それぞれのユーザーが自分のHOME
フォルダーを持ちます。自分のファイルは原則自分のHOME
フォルダーに置きます。他のユーザーのHOME
フォルダーに入ったり、ファイルを作成や削除したりができません。
WinSCPの画面の右上に部屋のマークがあります。それをクリックしたらHOME
フォルダーに戻ることができます。
ファイルやフォルダーをドラッグすることで簡単にダウンロードやアップロードすることができます。また、ファイルやフォルダーの上に右クリックでもダウンロードとアップロードができます。
右クリック → New → File / Directory
SSHサーバの上にコマンドやプログラムを実行するには無料ソフトPuTTYを使います。
まず前文に述べた通りWinSCPでサーバにアクセスします。次はWinSCPの画面でCtrl+pを押してPuTTYを立ち上げます。PuTTYが見つからない、というエラーが出れば、以下のリンクでPuTTYをダウンロードして、インストールしてください。
# PuTTYダウンロード (64-bit x86
を選んでください):
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
インストールした後、WinSCPの画面でもう一度Ctrl+pを押したら、PuTTYが立ち上がるはずです。PuTTYを最初に立ち上げる時も何らかの警告メッセージが出るが、Yesをクリックしてください。次はパスワードを入力してください (ユーサー名は自動的に入力される)。(パスワードを入力する時PuTTYの画面には何の変化も出ないです)
正常にログインしたら、(base) username@WangWuLab:~$
の後ろにカーソルがあるという状態になります。ここでコマンドやプログラムを実行することができます。
ここのusername
は与えられたユーザー名です。人それぞれ違います。WangWuLab
はこのパソコンの名前なので、変わらないです。~
はHOME
フォルダーを意味します。他のフォルダーに入ったら変わります。(base)
はAnacondaの環境を示し、pythonを実行するには必要です。(base)
が表示されなければ連絡してください。
# 基本のLinuxコマンドを少し分かるならサーバ上の操作に非常に役に立つので、「linuxコマンド」を検索して少し勉強したらいいと思います。例えば、htop
を打つと、CPUとメモリの使用率が分かります。df -h
を打つと、ディスクの使用量が分かります。
例えば一つ非常に時間がかかるPythonプログラムを実行する必要があるとします。自分のパソコンで実行してもいいですが、他にもいろいろしないといけない作業があるし、自分のパソコンは時々シャットダウンする必要もあります。こういう場合はこのプログラムをSSHサーバに移して、実行したほうが便利です。
まず、自分のパソコンでPythonプログラム (.py
ファイル)を用意します。次はこの.py
ファイルをサーバにアップロードします。例えば自分のHOME
フォルダーに置きます。次はPuTTYの画面で以下のコマンドを打ったらプログラムが実行されます (仮にプログラムのファイル名はmyprogram.py
)。
(base) username@WangWuLab:~$ python3 myprogram.py
(base) username@WangWuLab:~$ python3 myprogram.py
もしHOME
フォルダーに新しいフォルダーを作って (仮にフォルダー名はpython
)、プログラムのファイルmyprogram.py
をこのフォルダーに置きます。実行するにはまずcd
コマンドでこのフォルダーに入る必要があります。
(base) username@WangWuLab:~$ cd python (base) username@WangWuLab:~/python$ python3 myprogram.py
(base) username@WangWuLab:~$ cd python
(base) username@WangWuLab:~/python$ python3 myprogram.py
与えられたパスワードを変更することができます。PuTTYでログインした後、passwd
を打つことで変更できます。
以下のコードを自分のHOME
フォルダーに置いて実行すれば、直接指定時刻のすべてのFALMAサイトの波形を作ることができます。行10のstrTime
は指定の時刻 (linux time)です。行11のpicDir
は図の保存場所で、username
を実際のユーザー名に変更する必要があります。
行19〜34から各時期のデータの保存場所が分かります。
#!/usr/bin/env python3 import os import bz2 import numpy as np import datetime import matplotlib.pyplot as plt plt.rcParams['agg.path.chunksize'] = 20000 strTime = '1548422986' picDir = '/home/username/pic/' if os.path.exists(picDir)==False: os.mkdir(picDir) strNatTime = datetime.datetime.fromtimestamp(float(strTime)).strftime('%Y%m%d-%H%M%S') strDate = strNatTime[0:8] if strDate<'20180101': dataRoot = '/media/lightning/HDD1/2017Trans/'+strDate+'/' elif strDate<='20190331': dataRoot = '/media/lightning/HDD1/2018LF/'+strDate+'/' elif strDate<='20200331': dataRoot = '/media/lightning/HDD1/2019LF/'+strDate+'/' elif strDate<='20210509': dataRoot = '/media/lightning/HDD1/2020LF/'+strDate+'/' elif strDate<='20220331': dataRoot = '/media/lightning/HDD2/2021LF/'+strDate+'/' elif strDate<='20220705': dataRoot = '/media/lightning/HDD2/2022LF/'+strDate+'/' elif strDate<='20230320': dataRoot = '/media/lightning/HDD4/2022LF/'+strDate+'/' else: dataRoot = '/media/lightning/HDD6/2023LF/'+strDate+'/' absFileMat = [] siteMat = os.listdir(dataRoot) siteMat.sort() for siteName in siteMat: absFileName = dataRoot+siteName+'/'+siteName+'L'+strTime+'.bz2' if os.path.exists(absFileName)==True: absFileMat.append(absFileName) fileNum = len(absFileMat) if fileNum==0: raise SystemExit('No data exist for '+strTime) f = plt.figure(figsize=(8,10)) axNum = fileNum be = 0.05 te = 0.04 vb = 0 h = (1-be-te-vb*(axNum-1))/axNum le = 0.08 re = 0.03 w = 1-le-re axMat = list(range(axNum)) for i in range(axNum): axMat[i] = f.add_axes([le, be+(h+vb)*(axNum-1-i), w, h]) if i<axNum-1: axMat[i].set_xticks([]) tMat = np.linspace(0, 1000, 1000000) for i in range(axNum): absFileName = absFileMat[i] fid = bz2.BZ2File(absFileName) dataMat = np.frombuffer(fid.read(), np.int16) if len(dataMat)==5000000: dataMat = dataMat[0::5] fid.close() axMat[i].plot(tMat, dataMat, lw=1) axMat[i].set_xlim([tMat[0], tMat[-1]]) axMat[i].text(0.98, 0.97, absFileName[-18:-15], horizontalalignment='right', verticalalignment='top', transform = axMat[i].transAxes) axMat[-1].set_xlabel('Time (ms)') axMat[0].set_title(strNatTime) plt.savefig(picDir+strTime+'.png', dpi=300)
#!/usr/bin/env python3
import os
import bz2
import numpy as np
import datetime
import matplotlib.pyplot as plt
plt.rcParams['agg.path.chunksize'] = 20000
strTime = '1548422986'
picDir = '/home/username/pic/'
if os.path.exists(picDir)==False:
os.mkdir(picDir)
strNatTime = datetime.datetime.fromtimestamp(float(strTime)).strftime('%Y%m%d-%H%M%S')
strDate = strNatTime[0:8]
if strDate<'20180101':
dataRoot = '/media/lightning/HDD1/2017Trans/'+strDate+'/'
elif strDate<='20190331':
dataRoot = '/media/lightning/HDD1/2018LF/'+strDate+'/'
elif strDate<='20200331':
dataRoot = '/media/lightning/HDD1/2019LF/'+strDate+'/'
elif strDate<='20210509':
dataRoot = '/media/lightning/HDD1/2020LF/'+strDate+'/'
elif strDate<='20220331':
dataRoot = '/media/lightning/HDD2/2021LF/'+strDate+'/'
elif strDate<='20220705':
dataRoot = '/media/lightning/HDD2/2022LF/'+strDate+'/'
elif strDate<='20230320':
dataRoot = '/media/lightning/HDD4/2022LF/'+strDate+'/'
else:
dataRoot = '/media/lightning/HDD6/2023LF/'+strDate+'/'
absFileMat = []
siteMat = os.listdir(dataRoot)
siteMat.sort()
for siteName in siteMat:
absFileName = dataRoot+siteName+'/'+siteName+'L'+strTime+'.bz2'
if os.path.exists(absFileName)==True:
absFileMat.append(absFileName)
fileNum = len(absFileMat)
if fileNum==0:
raise SystemExit('No data exist for '+strTime)
f = plt.figure(figsize=(8,10))
axNum = fileNum
be = 0.05
te = 0.04
vb = 0
h = (1-be-te-vb*(axNum-1))/axNum
le = 0.08
re = 0.03
w = 1-le-re
axMat = list(range(axNum))
for i in range(axNum):
axMat[i] = f.add_axes([le, be+(h+vb)*(axNum-1-i), w, h])
if i<axNum-1:
axMat[i].set_xticks([])
tMat = np.linspace(0, 1000, 1000000)
for i in range(axNum):
absFileName = absFileMat[i]
fid = bz2.BZ2File(absFileName)
dataMat = np.frombuffer(fid.read(), np.int16)
if len(dataMat)==5000000:
dataMat = dataMat[0::5]
fid.close()
axMat[i].plot(tMat, dataMat, lw=1)
axMat[i].set_xlim([tMat[0], tMat[-1]])
axMat[i].text(0.98, 0.97, absFileName[-18:-15], horizontalalignment='right', verticalalignment='top', transform = axMat[i].transAxes)
axMat[-1].set_xlabel('Time (ms)')
axMat[0].set_title(strNatTime)
plt.savefig(picDir+strTime+'.png', dpi=300)
Back to Python関連資料