このページでは、覚えておかなくてもよいが、知っておいた方がいいというコマンドや UNIX システムの概念などを紹介する。これらのコマンドも把握しておくことで、さらなる効率化が期待できる。
データが大きいとき、共同研究者間で圧縮したものでやりとりするとスムーズである。データを圧縮する方法として、ZIP、GZIP、BZIP などがある。ZIP は、様々なファイルやディレクトリを圧縮するために一般的によく使われている。GZIP および BZIP はテキストデータに対する圧縮率が非常に大きいので、テキストデータを貯蓄されているデータベースでよく使われている。例えば、GenBank、Ensembl や SRA などでは大きなデータを GZIP あるいは BZIP で配布していることが多い。
ZIP は、データあるいはディレクトリそのものを圧縮できる。ZIP の圧縮は zip
コマンドを利用する。例えば、data ディレクトリの中にある ft.fa ファイルを圧縮するには、次のようにする。この際に、圧縮後のファイル名を先に書いてから、圧縮対象ファイルのパスを書く。順序を逆にすると、元のデータがなくなってしまうため、十分に注意すること。
xcd
cd unix4bi/samples
zip murphys_law.txt.zip murphys_law.txt
## adding: murphys_law.txt (deflated 49%)
ZIP 形式で圧縮されたファイルを解凍するには、unzip
コマンドを使用する。ディレクトリにすでに同様な名前のファイルが存在する場合は、上書きするかどうかを聞いてくるため、y, n, A, N, r のいずれかのキーを入力して、解凍を続ける。
xxxxxxxxxx
unzip murphys_law.txt.zip
## replace murphys_law.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: Y
## inflating: murphys_law.txt
なお、ディレクトリの圧縮はオプション -r
を付けて実行する。
xxxxxxxxxx
cd
cd unix4bi
zip -r samples.zip samples/
## adding: samples/ (stored 0%)
## adding: samples/1alk.fasta (deflated 68%)
## adding: samples/murphys_law.txt.zip (stored 0%)
## adding: samples/murphys_law.txt (deflated 49%)
unzip samples.zip
## Archive: samples.zip
## replace samples/1alk.fasta? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
## inflating: samples/1alk.fasta
## extracting: samples/murphys_law.txt.zip
## inflating: samples/murphys_law.txt
GZIP はファイルの圧縮形式である。ZIP とは異なり、GZIP はファイルのに適用できる。ファイルを圧縮するときは、gzip
コマンドを使用する。圧縮後のファイルの拡張子は .gz あるいは .gzip になる。次のコマンドを実行してから、ls
コマンドを実行して、ディレクトリの中を確認してみてください。
xxxxxxxxxx
cd
cd unix4bi/samples
ls
## 1alk.fasta murphys_law.txt murphys_law.txt.zip
gzip murphys_law.txt
ls
## 1alk.fasta murphys_law.txt.gz murphys_law.txt.zip
GZIP で圧縮されたファイルを解凍するには、gzip
コマンドに -d
オプションを付けて実行する。解凍後、拡張子 .gz が外れる。
xxxxxxxxxx
gzip -d murphys_law.txt.gz
データベースで配布されているゲノムのファイルは、圧縮後でも数ギガバイトに及ぶことがある。このようなゲノムデータを確認するとき、解凍して、内容を確認してから、もう一度圧縮するのは効率がわるい。そこで、ファイルを完全に展開せず、少しずつ展開して内容を確認することができる。gzip -d
コマンドにさらに -c
オプションを付けると、解凍後の情報が画面上に出力される。このとき、パイプを利用して、head
コマンド、grep
コマンドや less
コマンドを利用すれば、ファイルを展開しながら内容を確認できるようになる。
xxxxxxxxxx
cd
cd unix4bi/projects/athaliana
gzip genome.fa
gzip -dc genome.fa.gz | grep ">"
## >1 CHROMOSOME dumped from ADB: Feb/3/09 16:9; last updated: 2009-02-02
## >2 CHROMOSOME dumped from ADB: Feb/3/09 16:10; last updated: 2009-02-02
## >3 CHROMOSOME dumped from ADB: Feb/3/09 16:10; last updated: 2009-02-02
## >4 CHROMOSOME dumped from ADB: Feb/3/09 16:10; last updated: 2009-02-02
## >5 CHROMOSOME dumped from ADB: Feb/3/09 16:10; last updated: 2009-02-02
## >mitochondria CHROMOSOME dumped from ADB: Feb/3/09 16:10; last updated: 2005-06-03
## >chloroplast CHROMOSOME dumped from ADB: Feb/3/09 16:10; last updated: 2005-06-03
あるディレクトリ全体を圧縮するとき、後で紹介する tar
コマンドを利用する。
BZIP2 は GZIP に似せて作られているため、その使い方は GZIP とほぼ同じである。BZIP2 は、GZIP より圧縮率が高いものの、実行速度が遅いのが特徴である。BZIP2 の圧縮と解答は bzip2
コマンドを使用する。なお、一部のシステムには bzip2
コマンドがインストールされていないので、必要に応じてこれをインストールするとよい。
xxxxxxxxxx
cd
cd unix4bi/samples
bzip2 murphys_law.txt
bzip2 -d murphys_law.txt.bz2
TAR は圧縮形式ではなく、複数のディレクトリやファイルなどを取りまとめてアーカイブ化するものである。アーカイブすることによって、それらのディレクトリやファイルが見かけ上 1 つのファイルになるので、バックアップしたり、メールに添付したりしやすくなる。コマンドとして tar
に -cf
オプションを付けて使う。
xxxxxxxxxx
cd
cd unix4bi
tar cf data.tar data
アーカイブ化されたファイルは、オプション -xf
を使って展開することができる。
xxxxxxxxxx
tar xf data.tar
アーカイブ化はデータを見かけ上 1 つのファイルにまとめる操作である。したがって、ファイルが圧縮されていなく、ファイルサイズが大きいままである。そこで、そのアーカイブをさらに GZIP または BZIP で圧縮することができる。たとえば、gzip
コマンドで圧縮すると、data.tar.gz ファイルができる。
xxxxxxxxxx
ls
## data data_backup projects samples.zip
## data.tar hello_world.txt samples textdata
tar cf data.tar data
gzip data.tar
ls
## data data_backup projects samples.zip
## data.tar.gz hello_world.txt samples textdata
圧縮されたアーカイブを展開するには、まず解凍してからアーカイブを展開する。
xxxxxxxxxx
gzip -d data.tar.gz
tar xf data.tar
アーカイブと圧縮が一般的に利用されている。そのため、tar
と gzip
コマンドを使うこともできるが、tar
コマンド 1 つだけてアーカイブと圧縮を同時に行ってくれるオプションも用意されている。ファイルの拡張子は .tar.gz または略して .tgz にすることが多い。
xxxxxxxxxx
tar zcf data.tgz data
tar zxf data.tgz
ここでは tar
と gzip
コマンドの組み合わせを紹介した。実際に、tar
と bzip2
コマンドもまったく同様に使える。
CLI 操作でファイルの検索を行うこともできる。ファイル名で検索したり、あるいはファイル名の一部を指定して、パターンマッチで検索したりすることができる。例えば、data ディレクトリの下にある iris.csv ファイルを検索する場合は次のようにする。
xxxxxxxxxx
cd
cd unix4bi
find data -name "iris.csv"
## data/field_data/iris.csv
また、data ディレクトリの下にある .txt で終わるファイルを調べる場合は次のようにする。
xxxxxxxxxx
find data -name "*.txt"
## data/field_data/iris.txt
## data/field_data/yield_data/2010.txt
## data/field_data/yield_data/2011.txt
## data/field_data/yield_data/2008.txt
## data/field_data/yield_data/2009.txt
ファイル名に特定のパターンを含まないようなファイルを検索する際に !
を付ける。
xxxxxxxxxx
find data ! -name "*.txt"
## data
## data/field_data
## data/field_data/yield_data
## ...
## ...
## data/pdb/1wkp.fa
## data/pdb/1qo1.cif
条件が複数ある場合は、次のように OR または AND 演算子で検索できる。例えば、data ディレクトリにある拡張子が .csv または .txt のファイルを検索するには次のように -o
オプションで OR 検索する。
xxxxxxxxxx
find data -name "*.csv" -o -name "*.txt"
## data/field_data/iris.txt
## data/field_data/yield_data/2010.txt
## data/field_data/yield_data/2011.txt
## data/field_data/yield_data/2008.txt
## data/field_data/yield_data/2009.txt
## data/field_data/iris.csv
AND 検索は -a
オプションで行う。次は、ファイル名が leaf から始まり、かつ .fastq で終わるものを検索する例である。
xxxxxxxxxx
find data -name "leaf*" -a -name "*.fastq"
## data/fastq/leaf_1.fastq
## data/fastq/leaf_2.fastq
find
コマンドのオプション -mtime
、 -atime
や -ctime
オプションが用意されている。これらのオプションを使用することで、最近更新したファイルを検索することができる。例えば、data フォルダの下に、最近 3 日に内容を更新したファイルを調べるには、次のようなコマンドを実行する。
xxxxxxxxxx
find data -mtime -3
上で -3
を指定しているのに注意すること。マイナスをつけずにそのまま 3
を指定すると、3 日前(72 時間前から 96 時前間までの間)に更新したファイルが検索される。また、例えば、3 日以内に更新したファイルのうち、拡張子が .txt のファイルを検索するには、次のように -a
オプションで AND 検索すればよい。
xxxxxxxxxx
find data -mtime -3 -a -name "*.txt"
なお、mtime、atime、ctime はファイルスタンプの種類であり、UNIX システム上で保存されているファイルに付けられる属性である。
ファイルスタンプ | 意味 | 例 |
---|---|---|
mtime | modify time | 最終変更時刻。 ファイルの内容が変更されたときに日時情報が更新される。 |
atime | access time | 最終アクセス時刻。ファイルに対して cp や cat コマンドを実行したときに、そのファイルの日時情報が更新される。 |
ctime | change time | 最終ステータス変更時刻。 ファイルへの書き込みを行ったときやファイルのパーミッションを変更したときに日時情報が更新される。 |
ディレクトリの深さを指定して、ファイルの検索を行うこともできる。特定の深さに対してのみを検索するときはオプション -depth
を使用する。また、現在のディレクトリから指定した深さまで検索するときはオプション -maxdepth
を使い、現在のディレクトリから見たとき指定した深さ以下にあるディレクトリに対して検索するときはオプション mindepth
を使う。
xxxxxxxxxx
find data -maxdepth 2 -name "*.txt"
## data/field_data/iris.txt
find data -mindepth 2 -name "*.txt"
## data/field_data/iris.txt
## data/field_data/yield_data/2010.txt
## data/field_data/yield_data/2011.txt
## data/field_data/yield_data/2008.txt
## data/field_data/yield_data/2009.txt
パーミッションは権限のことである。UNIX システム上のすべてのディレクトリおよびファイルにはパーミッションが付けられている。パーミッションは実行権と所有権で構成されている。実行権は、読み取り、書き込み、実行の 3 種類の権限が組み合わせで表せる。それぞれの権限には記号あるいはそれに相当する整数が割り当てられている。
実行権 | 記号 | 整数 |
---|---|---|
読み取り可能 (readable) | r | 4 |
書き込み可能 (writable) | w | 2 |
実行可能 (executable) | x | 1 |
権限なし | - | 0 |
ディレクトリまたはファイルの権限は、rwx のような記号あるいは 7 のような整数で表すことができる。例えば、読み書きかつ実行が可能なファイルならば、その権限は rwx あるいは 7 で設定されている。7 は readable + writable + executable = 4 + 2 + 1 により計算される値である。また、読みと実行が可能で、書き込みが不可なファイルの権限ならば、r-x あるいは 5 で設定されている。5 は readable + executable = 4 + 1 で計算される値である。
パーミッションを構成するもう一つの所有権は 3 種類ある。これまで説明した実行権を「誰に」対してつけるのかを指定するために、所有権が使われる。この 3 種類の所有権は、自分(owner)、グループ(group)、および他人(other)である。
所有権と実行権を組み合わせたパーミッションを説明するために、次のような場面を考える。スパコンは多数のユーザーによって使われている。自分がスパコン上で作成したプログラムを、同一スパコン上にある共同研究者に共有したいとする。このプログラムを、自分でいつでも修正できて、実行できるようにしたい。しかし、共同研究者には読み取りと実行を許可するが、修正・変更できないようしたい。このような場合は、自分には実行権 7 を付けて、共同研究者には実行権 5 を付ける必要がある。一方で、自分と共同研究者以外の(スパコン上にいる)赤の他人にはプログラム自体を見せたくないので、そのような人には実行権 0 を付ける必要がある。ここでいう自分は所有権 owner のことであり、共同研究者は group のことであり、赤の他人は other のことである。そして、owner、group、other それぞれにに対して実行権 7、5、0 を付けたい。このとき、そのプログラムファイルの権限を 750 に設定すればよい。
ファイルあるいはディレクトリのパーミッションを確認するには、ls
コマンドに -l
オプションを付けることで、確認できる。試しに unix4bi ディレクトリの中のディレクトリ、および unix4bi の中にある samples ディレクトリの中にあるファイルのパーミッションを確認してみる。
xxxxxxxxxx
cd
cd unix4bi
ls -l
## total 2612
## drwxr-xr-x 5 donguri donguri 4096 Dec 6 03:01 data
## -rw-rw-r-- 1 donguri donguri 2099200 Dec 6 03:14 data.tar
## -rw-rw-r-- 1 donguri donguri 541329 Dec 6 03:15 data.tgz
## drwxr-xr-x 5 donguri donguri 4096 Dec 6 03:00 data_backup
## -rw-rw-r-- 1 donguri donguri 22 Dec 6 03:05 hello_world.txt
## drwxr-xr-x 4 donguri donguri 4096 Dec 6 02:54 projects
## drwxr-xr-x 2 donguri donguri 4096 Dec 6 03:14 samples
## -rw-rw-r-- 1 donguri donguri 2292 Dec 6 03:13 samples.zip
## drwxrwxr-x 2 donguri donguri 4096 Dec 6 03:01 textdata
ls -l samples
## total 12
## -rw-r--r-- 1 donguri donguri 968 Dec 5 12:00 1alk.fasta
## -rw-r--r-- 1 donguri donguri 1096 Dec 5 12:00 murphys_law.txt
## -rw-rw-r-- 1 donguri donguri 738 Dec 6 03:13 murphys_law.txt.zip
これらの出力結果を見ると、ファイルあるいはディレクトリの先頭に -rw-r--r-- や drwxr-xr-x などの記号を確認できる。これらの文字列がパーミッションを表している。-rw-r--r-- などの記号は 10 文字からなる。先頭の文字は d または - である。d ならばディレクトリを意味し、- ならばファイルを意味する。残りの 9 文字は、rw-、r--、r-- の3 文字ずつに分解でき、それぞれが owner、group、other に対する実行権となっている。
例えば -rw-r--r-- はファイルで、自分に対する権限は読み書きが可能で実行は不可、自分と同じグループに入っているユーザー(共同研究者)や他人は読み取りのみが可能となっている。上の例にはないが、例えば -rwxr-x--- ならば、これはファイルで、owner、group、other に対する権限がそれぞれ rwx、r-x、--- となっている。つまり、このファイルに対して、自分は読み書きかつ実行できるが、自分と同じグループの人は読み取りおよび実行しかできない。また、赤の他人は、このファイルの内容を見ることさえできないことになっている。
ls -l
の実行結果のうち、パーミッションの右側には donguri および staff の文字列が見られる。これは、このファイルあるいはフォルダの owner は donguri であり、group が staff となっていることを意味する。例えば、ファイルのパーミッションが -rwx-r----- ならば、donguri と同じグループ staff に入っているユーザーならば、このファイルの内容を読むことができる。
あるファイルあるいはディレクトリのパーミッションを変更するとき chmod
コマンドを使う。例えば、samples ディレクトリの中の murphys_law.txt ファイルのパーミッションを 750 に設定したいとき、次のようにする。
xxxxxxxxxx
ls -l samples/murphys_law.txt
## -rw-r--r-- 1 donguri donguri 1096 Dec 5 12:00 samples/murphys_law.txt
chmod 750 samples/murphys_law.txt
ls -l samples/murphys_law.txt
## -rwxr-x--- 1 donguri donguri 1096 Dec 5 12:00 samples/murphys_law.txt
ディレクトリに対しても同様に行える。
xxxxxxxxxx
ls -l
## total 2612
## drwxr-xr-x 5 donguri donguri 4096 Dec 6 03:01 data
## -rw-rw-r-- 1 donguri donguri 2099200 Dec 6 03:14 data.tar
## -rw-rw-r-- 1 donguri donguri 541329 Dec 6 03:15 data.tgz
## drwxr-xr-x 5 donguri donguri 4096 Dec 6 03:00 data_backup
## -rw-rw-r-- 1 donguri donguri 22 Dec 6 03:05 hello_world.txt
## drwxr-xr-x 4 donguri donguri 4096 Dec 6 02:54 projects
## drwxr-xr-x 2 donguri donguri 4096 Dec 6 03:14 samples
## -rw-rw-r-- 1 donguri donguri 2292 Dec 6 03:13 samples.zip
## drwxrwxr-x 2 donguri donguri 4096 Dec 6 03:01 textdata
chmod 750 data
ls -l
## total 2612
## drwxr-x--- 5 donguri donguri 4096 Dec 6 03:01 data
## -rw-rw-r-- 1 donguri donguri 2099200 Dec 6 03:14 data.tar
## -rw-rw-r-- 1 donguri donguri 541329 Dec 6 03:15 data.tgz
## drwxr-xr-x 5 donguri donguri 4096 Dec 6 03:00 data_backup
## -rw-rw-r-- 1 donguri donguri 22 Dec 6 03:05 hello_world.txt
## drwxr-xr-x 4 donguri donguri 4096 Dec 6 02:54 projects
## drwxr-xr-x 2 donguri donguri 4096 Dec 6 03:14 samples
## -rw-rw-r-- 1 donguri donguri 2292 Dec 6 03:13 samples.zip
## drwxrwxr-x 2 donguri donguri 4096 Dec 6 03:01 textdata
しかし、この場合は、ディレクトリのパーミッションが 750 に変更されるが、そのディレクトリの下にあるファイルのパーミッションは変更されない。ディレクトリとその下にあるファイルをすべて一括に 750 に変更したい場合は、次のように -R
オプションを利用する。
xxxxxxxxxx
chmod -R 750 data
group の概念を使うためには、自分と共同研究者を同じグループに設定する必要がある。この設定はスパコンの管理者しか行えない。したがって、データあるいはプログラムを共有したい場合は、スパコンの管理者に相談し、同じグループになるように設定してもらう必要がある。
また、1 つのユーザーは複数のグループに属することができる。例えば、A、B、C ユーザーが alphabet グループに、A, X, Y ユーザーが alphazero グループになるように設定できる。このとき、A は B および C とデータ共有でき、また X および Y ともデータ共有できる。しかし、B・C と X・Y は互いに赤の他人状態である。
リンクは、ショートカットのようなものである。本来は、コンピュータの特定のディレクトリにあるデータを、自分のディレクトリにあるかのように使いたいとき、そのデータを自分のホームディレクトリをコピーしてくる必要がある。しかし、データが大きいとき、同じようなデータが 2 箇所置かれることになり、ディスク容量を消費する上で、2 箇所のデータのどれが最新なのかを把握できなくある。
そこで、データをまるごとコピーするのではなく、そのデータのディレクトリを見かけ上、自分のディレクトリにあるように置くことができるようになる。このようなものをリンクと呼ぶ。リンクを付けるには ln
コマンドを使う。使い方として、ln
コマンドに -s
オプションを付ける。続けて、データが存在しているパスを指定して、そのあとにリンクの名前を書く。初心者にとって、リンクの概念が難しいので、すぐに理解できなくてもよい。
次は、projects ディレクトリのリンクを projects2 という名前で、data ディレクトリの下に作成する例を示している。
xxxxxxxxxx
cd
cd unix4bi
ln -s /home/donguri/unix4bi/projects data/projects2
リンクを作成すると、そのリンクは、見かけ上リンクもとと全く同じものになる。
xxxxxxxxxx
ls projects
## athaliana mouse
ls data/projects2
## athaliana mouse
エイリアスは別名・偽名の意味である。長いコマンドを短くしたりすることができる。例えば、ls
コマンドはファイルの一覧しか表示しないが、ls -lh
はファイルの一覧とファイルサイズなども出力されるため、ls -lh
が多用される。ls -lh
を毎回使用すると、煩雑であるため、この ls -lh
と同じ機能を持つ新しいコマンド llh
を作ることができる。
xxxxxxxxxx
llh
## bash: llh: command not found
alias llh='ls -lh'
llh
## total 2.6M
## drwxr-x--- 5 donguri donguri 4.0K Dec 6 03:19 data
## -rw-rw-r-- 1 donguri donguri 2.1M Dec 6 03:14 data.tar
## -rw-rw-r-- 1 donguri donguri 529K Dec 6 03:15 data.tgz
## drwxr-xr-x 5 donguri donguri 4.0K Dec 6 03:00 data_backup
## -rw-rw-r-- 1 donguri donguri 22 Dec 6 03:05 hello_world.txt
## drwxr-xr-x 4 donguri donguri 4.0K Dec 6 02:54 projects
## drwxr-xr-x 2 donguri donguri 4.0K Dec 6 03:14 samples
## -rw-rw-r-- 1 donguri donguri 2.3K Dec 6 03:13 samples.zip
## drwxrwxr-x 2 donguri donguri 4.0K Dec 6 03:01 textdata
ジョブ実行中に、ジョブを中断することができる。ジョブの中断は SIGINT と SIGSTP の 2 種類がある。SIGINT は、割り込みと呼ばれるもので、現在実行しているジョブを一時停止することを意味する。一時停止したプログラムを後で再開せることができる。例えば、ノートパソコンで何かの重い計算を実行していて、途中で、アポなしミーティングに参加する必要がでてきたとする。このとき、現在の重たい計算を一時停止(SIGINT)して、軽くなったノートパソコンでミーティングに参加して、ミーティング後に計算を再開させることができる。これに対して、SIGSTP は処理そのものを中止するときに使う。例えば、処理対象のファイルを間違えたり、プログラムにバグがあることに気付き、計算そのものにはもう意味がなく、すぐに中止したい場合に使う。
実行中のジョブを一時停止(SIGINT)したい場合は、Ctrl キーを押しながら z キーを押す。これで、実行中のジョブが一時停止される。ジョブを一時停止した後に、ターミナルを終了しないようにしてください。
xxxxxxxxxx
sleep 10000
<Ctrl> + <Z>
## [1]+ Stopped sleep 10000
一時停止したジョブを再開するには、Ctrl + z を実行したターミナルで、 fg
コマンドを実行すれば、ジョブが再開される。
xxxxxxxxxx
fg
実行中のジョブを完全に中止(SIGSTP)したいときは、Control キーを押しながら c キーを押す。これで、実行中のジョブが完全に停止される。
xxxxxxxxxx
sleep 10000
<Ctrl> + <C>
なお、Ctrl + c でプログラムを終了できない場合、そのプログラムが入力待ち受け状態になっている可能性がある。このとき、Control キーを押しながら d キーを押してください。これで入力待ち受け状態から抜ける。その後、必要あれば、Ctrl + c でプログラムを終了させることができる。
nohup
コマンドは、実行時間の長いジョブを実行するときに使うと便利なコマンドである。スパコンあるいは研究所のクラスタコンピュータで数日かかるような処理を行う場合、ターミナルからそのままコマンドを入力して処理を行うと、処理中にずっとそのターミナルをスパコンあるいはクラスタに接続した状態で保持する必要がある。スパコンあるいはクラスタに数日間接続し続けるのは非現実的で、かつセキュリティー上にもよくない。
nohup
コマンドは、接続が切断され、ターミナルを閉じられも計算を続けるようにするコマンドである。その使い方として、本来実行したいコマンドを、 nohup
と &
囲むだけである。例えば、普通であれば、ディレクトリの一覧を出力するコマンドは次のように実行できる。
xxxxxxxxxx
ls -alh
このコマンドを nohup
で実行するには、次のように、ls -alh
を nohup
と &
で囲むだけでよい。
xxxxxxxxxx
nohup ls -alh &
## nohup: ignoring input and appending output to 'nohup.out'
デフォルトでは、実行結果は nohup.out ファイルに保存される。
別の例をもう一回見てみる。例えば hisat2
というコマンドは次のように使うとする。
xxxxxxxxxx
hisat2 -x TAIR10 -U leaf.fastq -S leaf.sam
このコマンドを nohpu
で実行する場合は、次のようにする。
xxxxxxxxxx
nohup hisat2 -x TAIR10 -U leaf.fastq -S leaf.sam &
nohup
コマンドを利用すれば、スパコンあるいはクラスタに常に接続しなくてもジョブを実行し続けることができる。非常に便利だが、nohup
で実行するジョブが多すぎると、システムリソースの消費量が把握できなくなるため、システム全体の動作が著しく遅くなる。この場合、同じシステム上にいる他のユーザーに迷惑をかけてしまう。そのため、小規模の研究室であれば、nohup
の使用を認めてくれることはあるが、スパコンなどでは nohup
の使用が禁止されている。いずれにせよ、nohup
が使用できるかどうかをコンピュータの管理者に確認しておくと無難である。
screen
コマンドも長時間かかるようなジョブを実行するときに使うと便利なコマンドである。nohup
コマンドでジョブを実行すると、ジョブの進行を確認できなくなる。ジョブのプロウス番号とジョブの出力などは nohpu.out に保存されるが、そのジョブを一時中止して再開したりすることができない。これに対して、screen
コマンドでは、ジョブの実行画面をそのまま保持するようなイメージである。UNIX を初めて学ぶ人にとって難しいため、実際に UNIX システムを数年使用してから挑戦してみるとよい。
ネットワークから大型クラスタコンピュータ上でデータ解析の作業していると考えよう。このデータ解析の作業が特殊で、一連の解析を次々と行っておく必要があり、途中で止めると、最初から操作しなければならないものとする。データ解析のために、まず、自分のパソコンを立ち上げて、ターミナルを使ってクラスタに接続する。その後、そのターミナル上でコマンドを少しずつ実行していき、データを解析しいく。ここで、データ解析中に、急な用事ができたとする。このとき、ネットワークを切断して、その用事を済ませなければならない。その後、用事を済ませた後に、クラスタに再接続して、作業を再開しようとするが、今まで入力したコマンドをまた最初から入力しなければならなくなる。
screen
コマンドを利用すると、この状況を回避できるようになる。まず、自分のパソコンからクラスタに接続する。接続後、すぐに screen
コマンドを実行する。screen
コマンドを実行した後に、普段通りにコマンドを実行し、データ解析を進める。途中で急に用事ができたとする。このとき、Control キーをしながら a キーを押してから両者を離して、続けて d キーを入力する(<Ctrl + a> + b)と、screen 状態から抜けられるようになる。この操作をデタッチとよぶ。デタッチすると、screen の状態から抜けるが、screen の本体はそのままスパコン上で存続している。用事を済ませた後に、screen -r
を実行すると、再びさきほどデタッチした screen に接続できるようになり、それまでに行われた操作やそのときのターミナル画面がそのまま表示される。
screen
コマンドは便利だが、とっつきにくい。興味あったら、使い方を調べてみてください。
一部の大文字で描かれる変数は、環境変数やシェル変数と呼ばれている。これらの変数は、システムが正しく動作する上で必要な変数であるため、不必要な変更を行わないようにしておくとよい。よく見かける変数には次のようなものがある。これ以外にも数十個以上存在するが、複雑な処理を書かなければ、ほとんど使うことがない。
変数 | 動作 |
---|---|
SHELL | 現在使用しているシェルの種類。 |
HOME | ホームティレクトリのパス。 |
PATH | コマンドのパス。 |
PWD | 現在のディレクトリのパス。 |
試しに、これらの変数の中身を echo
コマンドで出力してみる。
xxxxxxxxxx
cd
cd unix4bi
echo ${SHELL}
## /bin/bash
echo ${HOME}
## /home/donguri
echo ${PATH}
## /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
echo ${PWD}
## /home/donguri/unix4bi