参考ウェブサイト


Bash

for文

例えば,hosts.listというファイルに,

 moca01
 moca02
 moca03
 ...

のように,ホスト名が書いてあり,その各ホストでcommandを実行したい場合,

 $ for host in `cat hosts.list`; do ssh $host command; done

とすれば良い.

コマンドのbackgroundでの実行

somethingというコマンドをbackgroundで実行する場合,

 $ ./something &

のように,「&」を最後に追加して実行すれば良い. 既に実行してしまったコマンドがあり,コマンド入力が受け付けてもらえない場合は,「Ctrl+z」で実行中のコマンドを「Stopped」の状態にする.

 $ jobs

で,どれだけのコマンドがbackgroundもしくはStoppedになっているか確認できる. 例えば,

 [1]+   Stopped              ./something

のようになっていたら,

 $ fg 1

とすることで,Stoppedのジョブをforegroundで実行に戻すことができる. また,

 $ bg %1

とすることで,Stoppedのジョブをbackgroundで実行に戻すことができる.

特定のファイルを除いてtarでアーカイブ

tarで保存しておきたいものがたくさんあるが,ディレクトリのなかには不要なものもたくさん存在している場合などは,特定のファイルやディレクトリを除いてアーカイブしたい. そんなときは,exclude.txtというファイルを作成して,

output*
err.*
akr??[1-9]
*.tgz

などのように書いておいて,

$ tar cvzf hoge.tgz ./to-be-archived-dir -X ./exclude.txt

のようにすると,exclude.txtに書かれた内容にマッチするものは除いてアーカイブしてくれるので,ファイルサイズや時間の節約になる.

特定のフォルダを除いてコピー

$ rsync -av --progress srcdir path/to/distdir/ --exclude dir_to_be_excluded

findで見つかったものをtarでまとめる

参考

結論としては,以下のようにすればよい.

$ find . -name "log*" -print0 | tar -cvz -T - --null -f /tmp/log01.tar.gz

ポイントは,

  • find-print0オプションをつける.
  • tar側は-T -でパイプラインからまとめるべきものリストを受け取る.
  • tar--nullオプションをつける.(これは受け取ったリストが\0で区切られていることを指定)

awk

特定の行だけを出力

$ awk 'NR==100 { print; }' hoge.txt

ファイルhoge.txtの100行目だけが出力される.

sedによるテキストの置換

ファイルhoge内に, abcdef という文字列があり,abcをxyzに変更したい場合.

$ sed -e 's/abc/xyz/' hoge

とすれば,標準出力に出力される. 結果をファイルにそのまま書き込みたい場合には,

$ sed -i.old -e 's/abc/xyz/' hoge

のように,「-i[SUFFIX]」オプションを付けることで,SUFFIXの付いたバックアップファイルを作成しながら,ファイル内で置換してくれる.

行数を指定したい場合は,

$ sed -e '2,5s/abc/xyz/' hoge

のようにする.この場合は,2行目から5行目に作用する.


egrepによる複数条件検索

$ egrep 'one|two|three' hoge.txt

で,hoge.txt内の上記3つの条件のいづれかに適合する行を表示する.


SSH

Hostbased認証の設定

研究室の計算機群は,各々が外界と繋がっている必要がないために,ほとんど閉じたネットワークになっている. 閉じたネットワーク内の各計算機の間ではログイン,ログオフを頻繁に行うので,閉じたネットワーク内にいる計算機間は互いの計算機を信用してユーザのログイン,ログオフを保証するという方法を用いる. 「クライアント --- SSH - サーバ」のようにSSHでログインすることを考える.

クライアント側の設定

/etc/ssh/ssh_configに

Host *
   ...
   HostbasedAuthentication yes
   EnableSSHKeysign yes
   ...

のように,「HostbasedAuthentication yes」を加える. バージョンによって「EnableSSHKeysign yes」はなくても良いことがある.

サーバ側の設定

/etc/ssh/sshd_configに

 HostbasedAuthentication yes
 IgnoreUserKnownHosts yes

を加える. 次に,クライアントの公開鍵を/etc/ssh/ssh_known_hostsに加える.

 # ssh-keyscan -t rsa client.domain,ipaddress >> /etc/ssh/ssh_known_hosts

次に,/etc/ssh/shosts.equivに client.domainを加える. 最後に,sshdを再起動

 # service sshd restart

クライアント側で,

 $ ssh -v server

とすればhostbased認証ができているか確認できる. 注) クライアントとサーバでusernameとuidが一致している必要があると思う.

サーバ毎の個別の設定

~/.ssh/configの中にサーバ毎の個別の設定を記述する.

  • ホスト名の略称
  • ログインID
  • RSA key

など.

Host remotehost
    HostName remotehost.domain.jp
    User username
    IdentityFile ~/.ssh/remotehost.key

X11の透過

リモートホストでgnuplotなどのX11を利用するソフトウェアを使用する場合は,X11をSSHでトンネルする必要がある. リモートホスト側では,/etc/ssh/sshd_configの中で

X11Forwarding yes

としておく. ローカルホスト側では,~/.ssh/configの中に,

Host *
     ForwardX11 yes
     ForwardX11trusted yes

とのように,「ForwardX11」と「ForwardX11trusted」をyesとしておく. trustedの方がyesでなければいけないかどうかいまいち分かないが,gnuplotでx11ターミナルが開けないときに,trustedの方をyesとすることで解決できたことがあった.

ssh経由のアーカイブ・コピー

リモート・ホスト(remote)からローカル(local)へディレクトリをコピー

local$ ssh remote "cd somewhere/; tar cpvzf - directory" | tar xpvzf -

こうすると,remote の somewhere/directory が local の ./directory にコピーされる. tarのオプション p は,—preserve-permissions で付けておいた方が良い?


GNU Parallel

gzipコマンドを並列実行

$ gzip hoge.txt

を実行すると hoge.txt が圧縮されて hoge.txt.gz に変換される. このようなファイルが多量にある場合,parallelコマンドを使って,次のようにする.

$ ls hoge_* | parallel "gzip {}"

これでパイプされたファイルのリストをそれぞれ圧縮するという作業がコアの数だけ並列化されて効率化される.


pdsh

Parallel Distribution Shell (pdsh) を使うと複数ホストで同じコマンドを同時に実行することができるので,クラスタの管理が楽になるかもしれない.

グループの登録

pdshは

  • ~/.dsh/group/
  • /etc/dsh/group/

の順にグループを検索するので,上記フォルダにグループ名のファイルを置いてその中にホスト名を列挙しておく.

ネットワーク内のホストの情報

 $ pdsh -g king hostname

とかすると,kingというグループのホストに同時にhostnameコマンドを実行できる.

参考ページ

NFSの更新の問題

NFSではサーバの負荷を下げるためにキャッシュを利用するが,ファイルが別ノードでは更新されたのにキャッシュ上は古いという場合が生じる.どうやったらこの問題を回避することができるか?


gnuplot

histgram

bin(x,width)=width*floor(x/width)
binwidth=5
plot 'datafile' using (bin($1,binwidth)):(1.0) smooth freq with boxes

R風のグラフ描画

グラフの枠を左と下だけにし,目盛を外側に表示するには,

 gnuplot> set border 3
 gnuplot> set tics out
 gnuplot> set tics nomirror

とすれば良し.

gnuplotから動画を作るまで

連番ファイルの自動plot

なんらかの時間発展の結果などをデータで出力してgnuplotで順々に出力したいときがある. 例えば,out001, out002, …, out100まで100個のデータファイルがあるとする. それを順々にplotするには,以下の二つのファイルを用意する. まずは,以下のようなファイル「gp.batch

 nsmpl=100
 unset key
 
 set xrange [0:800]
 set yrange [0:500]
 
 % set term png
 set pointsize +1
 interval=0.05
 i=1
 load "gp.batch.loop"

もう一つは,このファイルから呼び出されるファイル「gp.batch.loop

 set parametric
 
 % outfile=sprintf("pic%03d.png",i)
 % set output outfile
 
 infile=sprintf("out%03d",i)
 plot infile us 1:2 w p
 
 if( i<nsmpl ) i=i+1; pause interval; reread
 exit

これらを用意して,

 $ gnuplot
 gnuplot> load 'gp.batch'

とするすることで,100枚のデータを順に出力してくれる.上記のスクリプトでsprintf関数が使えるというのが嬉しい.

画像ファイルの出力と動画変換

上記のスクリプトで%でコメントアウトしてある部分のコメントを外して同様の作業をすると,pic001.png, pic002.png, …, pic100.pngという連番のPNGファイルが生成される.こうしておいて,

 $ convert -verbose -delay 10 pic*.png movie.mpeg

とすることでMPEG形式の動画に変換される.多少画質が粗いかもしれない.High resolusionの動画にするにはどうしたらよいか忘れた...

注) 上記のconvertコマンドは,ImageMagickffmpegがインストールされてないと使えない.Macならばmacportsで簡単にインストールできるはず.


ホスト名の変更

  • /etc/hosts
  • /etc/sysconfig/network

上記2つのファイルを変更して,

 #  /etc/rc.d/init.d/network restart

PBS/Torqueのホスト名の設定

バッチジョブシステムのPBS/Torqueは,ホスト名を上記のシステム設定とは別に持っている.

 # cat /var/spool/torque/server_priv/nodes
 puma.bw.nitech.ac.jp np=32 gpus=1

上記のファイルを変更すればよい.