参考ウェブサイト
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
に-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コマンドは,ImageMagick
とffmpeg
がインストールされてないと使えない.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
上記のファイルを変更すればよい.