Linux

Linux 周辺のこと

Linux について。

(一部 CentOS を想定)

目次

基本的なこと

  • パスワードの変更 (password)。 上記コマンド実行後、古いパスワードおよび新しいパスワードを順番に入力。
  • ディレクトリの移動 (change directory)。
    • ホームディレクトリに移動。
      1$ cd ( または cd ~ )
      ただし、ただの cd コマンドは、実際は環境変数 CDPATH に設定された path へ移動の意。
    • 1 つ上のディレクトリに移動 ( 2 つ上に行きたいときは、cd ../.. )
    • 1 つ前に居たディレクトリに移動
    • ルートディレクトリ ( / ) に移動
  • リンクを貼る (link)。
    • ハードリンクを貼る
      1$ ln <元ファイル> <リンク先>
      ハードリンクは実際にその場所にファイルのコピーを作る。但し、どちらか片方の中身を修正すればどちらにも変更が適用される。
    • シンボリックリンクを貼る
      1$ ln -s <元ファイル> <リンク先>
      シンボリックリンクは元ファイルへのショートカットを作る。ディスク容量は消費しない。
  • シンボリックリンク先の名前を調べる (readlink)。
    • シンボリックリンクの指し示す先を表示。
      1$ readlink <シンボリックリンク>
    • シンボリックリンクの指し示す先を (存在しなくても) 絶対パスで表示。
      1$ readlink -f <シンボリックリンク>
  • 一定時間ごとに決まったコマンドを実行する (watch)。
    1watch -n 10 --differences cat sample.txt
    対称となる watch のオプションは -n <数字> で秒数を指定し、--differences で変更箇所のハイライトをするオプション。 この例では、sample.txt の中身を 10 秒ごとに表示している。
  • コマンドの履歴を活用する (history+ α)。
    (参照: シェルのコマンド履歴からの再利用、のいろいろ - 元RX-7乗りの適当な日々)
    • コマンドの履歴を表示する。 左から番号、日付、時間、コマンドが表示される。
    • history にあるコマンドを実行する。
      • 直前のコマンドを実行 (!!)。
      • <番号> 番目のコマンドを実行 (!<番号>)。 history にある 855 番のコマンドを実行。
      • <文字列>から始まるコマンドを実行 (!<文字列>)。 history の中にある最近実行されたコマンドで pw から始まるものを再実行する。
      • <文字列>を含むコマンドを実行 (!?<文字列>)。 history の中にある最近実行されたコマンドで pw を含むものが実行される。(上の例だと、which pwd とか)
      • 文字列の 1 回の置換後に実行 (:s)。
        1$ !900:s/hoge/fuga/
        900 番目に実行したコマンドの最初の hoge の部分を fuga に変えて実行する。2 つある場合はある回数だけ :s/<文字列>/<文字列>/ コマンドを書く。
      • コマンド全体の hoge を fuga に変換したい場合は g を頭に付ける。
        1$ !900:gs/hoge/fuga/
    • いきなり実行するのは怖いので一旦表示することもできる。 こうすると、直前の gn から始まるコマンドを表示する。
    • インタラクティブにコマンドを探して実行。
      Ctrl + R キーを押す。
      1(reverse-i-search)`':
      と出るので、適当にコマンドを打つと、history にあるコマンドで一致するものが提示されるので欲しいコマンドが出てきたときに Enter を押す。q で何もせずに解除。
    • 直前のコマンドの引数 ($_) を使う。
      直前のコマンドの引数は $_ に入っている。なので、以下のようにディレクトリを作ってすぐにそのディレクトリに移動する場合など便利。以下の 2 通りの方法で可能。
      1$ mkdir hoge && cd $_
      2$ mkdir hoge; cd $_
      && は前のコマンドが正しく実行された場合に後に続くコマンドを実行する、というコマンドですので、一行目の方が安全です。
  • システム全体の容量を確認する ( df ) -h オプション (h: human) で人に分かりやすいように適切なサイズで表示する。
  • ディスクの使用量を確認する (disk usage)。

シェル (bash) スクリプト関連

シェルスクリプトは覚えると大変便利なので、是非勉強すべき。
  • Usage を作る。

    たとえ自分だけが使うとしても、将来の自分が理解できるようにスクリプトの使い方を Usage としてまとめておくべき。例えば、以下のようにファイルに付記する。
    01##### usage #####
    02function usage_exit() {
    03cat << EOF
    04Usage: $(echo $(basename $0)) [option] param
    05  param:    --file <file>: upload <file>
    06  option:   --type <type>: uploading type (default: $type)
    07            -h|--help    : show this message
    08EOF
    09exit 1
    10}
  • オプションを付ける。

    スクリプトにオプションを渡して自由度を高めておけば、便利。
    01OPT=$(getopt -o h \
    02             -l file:,type:,help -- "$@")
    03[ $? != 0 ] && usage_exit
    04 
    05eval set -- "$OPT"
    06while true; do
    07  case $1 in
    08    --file) file=$2; shift;;
    09    --type) type=$2; shift;;
    10    -h|--help) usage_exit;;
    11    --) shift; break;;
    12  esac
    13  shift
    14done
    15shift $(( OPTIND -1 ))
    上記スクリプトは以下の getopts 関数を使っても書けるが、ロングオプションを使えるなど、上記の方が自由度が高い。
    1while getopts f:t:h OPT; do
    2  case $OPT in
    3    f) file="$OPTSRG";;
    4    t) type="$OPTARG";;
    5    h) usage_exit;;
    6    *) usage_exit;;
    7  esac
    8done
    9shift $(($OPTIND - 1))
  • awk の細かいこと (基本的なことは後日追加予定)
    • awk によって計算されて代入された変数には改行が含まれる (?)。
      (例)
      1$ val1=$(awk 'BEGIN{printf "%15.7E", 1.0}')
      2#---error---
      3$ val2=$(awk 'BEGIN{printf "%15.7E", '$val1'}')
      4awk: cmd. line:1: BEGIN{printf "%15.7E",
      5awk: cmd. line:1:                        ^ unexpected newline or end of string
      6#---correct---
      7$ val1=$(echo -n $val1); val2=$(awk 'BEGIN{printf "15.7E", '$val1'}')
      ここで、echo のオプション -n は、次の行を読み込まないオプション。

サーバー管理関連

  • 新しいユーザーを追加
    1# useradd <ユーザー名>
  • ユーザーを削除
    1# userdel -r <ユーザー名>
    -r オプションで、ホームディレクトリとその中身も削除。
  • ユーザー名の変更
    1# usermod -l <新しいユーザー名> <古いユーザー名>
  • ホームディレクトリの変更
    1# usermod -d <新しいホームディレクトリ> <ユーザー名>
  • <ユーザー> のパスワードの変更
    1# passwd <ユーザー>
    古いパスワードは訊かれないので、新しいパスワードを入力。
  • CentOS のバーション確認
    1$ cat /etc/redhat-release
  • メモリの確認
  • 詳しい CPU の情報
    1$ cat /proc/cpuinfo
  • 詳しい メモリーの情報
    1$ cat /proc/meminfo
  • ネットワーク関係の情報の確認
  • ハードディスクの増設等
    Linux はハードディスクのマウント (接続して使えるようにすること) を自分で行う必要がある。 以下では、2 TB を超えるハードディスクのパーティションを区切ったり、マウントしたりする方法を示す。
    • ディスクの確認 (parted)
      01parted -l
      02Model: ATA WDC WD2003FYYS-0 (scsi)
      03Disk /dev/sda: 2000GB
      04Sector size (logical/physical): 512B/512B
      05Partition Table: msdos
      06 
      07Number  Start   End     Size    Type     File system     Flags
      08 1      1049kB  538MB   537MB   primary  ext4            boot
      09 2      538MB   69.3GB  68.7GB  primary  linux-swap(v1)
      10 3      69.3GB  138GB   68.7GB  primary  ext4
      11 4      138GB   2000GB  1862GB  primary  ext4
      12 
      13 
      14Model: ATA Hitachi HUA72303 (scsi)
      15Disk /dev/sdb: 3001GB
      16Sector size (logical/physical): 512B/512B
      17Partition Table: gpt
      18 
      19Number  Start  End  Size  File system  Name  Flags
      20 
      21 
      22Model: Seagate Expansion Desk (scsi)
      23Disk /dev/sdc: 3001GB
      24Sector size (logical/physical): 512B/4096B
      25Partition Table: gpt
      26 
      27Number  Start   End     Size    File system  Name        Flags
      28 1      1049kB  3001GB  3001GB  ext4         seagate3TB
      この例では、/dev/sda、/dev/sdb、/dev/sdc というデバイス名が確認できる。/dev/sdb のテーブルには何も表示されていないので、これが今回接続したばかりの HDD だということが分かる。
      また、2 TB 以下の HDD に関しては、 fdisk というコマンドが使える。違いに関しては、 Linuxer の備忘録 にあるので参考に。今後は parted が使えればいいと思う。
    • パーティションを区切る
      上の例に従って作業を説明する。
      1parted /dev/sdb
      2GNU Parted 2.1
      3Using /dev/sdb
      4Welcome to GNU Parted! Type 'help' to view a list of commands.
      5(parted)
      として、 parted の対話モードに入り、
      1(parted) mklabel
      2New disk label type? gpt                                                 
      3Warning: The existing disk label on /dev/sdb will be destroyed and all data on
      4this disk will be lost. Do you want to continue?
      5Yes/No? Yes
      として、パーティションを GPT テーブルで区切ることを宣言。実際に次のコマンドでパーティションを区切る。 (パーティションの名前やタイプは場合に応じて変える。以下は 1 パーティションに区切る場合。)
      1(parted) mkpart
      2Partition name?  []? BACKUP
      3File system type?  [ext2]? ext4                                          
      4Start? 0%                                                                
      5End? 100%
      quit で終了する。内容を確認すると、
      01parted -l
      02Model: ATA WDC WD2003FYYS-0 (scsi)
      03Disk /dev/sda: 2000GB
      04Sector size (logical/physical): 512B/512B
      05Partition Table: msdos
      06 
      07Number  Start   End     Size    Type     File system     Flags
      08 1      1049kB  538MB   537MB   primary  ext4            boot
      09 2      538MB   69.3GB  68.7GB  primary  linux-swap(v1)
      10 3      69.3GB  138GB   68.7GB  primary  ext4
      11 4      138GB   2000GB  1862GB  primary  ext4
      12 
      13 
      14Model: ATA Hitachi HUA72303 (scsi)
      15Disk /dev/sdb: 3001GB
      16Sector size (logical/physical): 512B/512B
      17Partition Table: gpt
      18 
      19Number  Start   End     Size    File system  Name    Flags
      20 1      1049kB  3001GB  3001GB               BACKUP
      21 
      22 
      23Model: Seagate Expansion Desk (scsi)
      24Disk /dev/sdc: 3001GB
      25Sector size (logical/physical): 512B/4096B
      26Partition Table: gpt
      27 
      28Number  Start   End     Size    File system  Name        Flags
      29 1      1049kB  3001GB  3001GB  ext4         seagate3TB
    • ファイルシステムを作る (cf: Linux パーティションに mkfs でファイルシステムを作る )
      上の参照記事にあるように、ファイルシステムにはいくつかの種類があるが、今後使い続けられる ext4 を用いることにする。
      01mkfs.ext4 /dev/sdb1
      02mke2fs 1.41.12 (17-May-2010)
      03Filesystem label=
      04OS type: Linux
      05Block size=4096 (log=2)
      06Fragment size=4096 (log=2)
      07Stride=0 blocks, Stripe width=0 blocks
      08183148544 inodes, 732566272 blocks
      0936628313 blocks (5.00%) reserved for the super user
      10First data block=0
      11Maximum filesystem blocks=4294967296
      1222357 block groups
      1332768 blocks per group, 32768 fragments per group
      148192 inodes per group
      15Superblock backups stored on blocks:
      16        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
      17        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
      18        102400000, 214990848, 512000000, 550731776, 644972544
      19 
      20Writing inode tables: done                           
      21Creating journal (32768 blocks): done
      22Writing superblocks and filesystem accounting information: done
      23 
      24This filesystem will be automatically checked every 22 mounts or
      25180 days, whichever comes first.  Use tune2fs -c or -i to override.
      ここで指定するのは、パーティション名である /dev/sdb1。デバイス全体である /dev/sdb を指定すると怒られる。 しばらく待っているとファイルシステムが構築される。
    • マウントする (cf: Linux ハードディスクをマウント (mount) する )
      マウントするディレクトリを作ってからマウントする。
      1mkdir /BACKUP
      2mount /dev/sdb1 /BACKUP
      ここでは、ルート (/) の下に BACKUP というディレクトリを作ってマウントした。
      ついでにアンマウントする方法は以下。
      1umount /dev/sdb1
      きちんとマウントできたかどうか df コマンドで確かめる。
    • マシンが起動時に毎回自動でマウントするように、/etc/fstab に書き込む。 まずは、すでにある fstab を確認すれば良いが、 参照記事 にあるように、デバイスの指定には複数の方法がある。mkfs でラベルを付ける方法や、UUID を使う方法など。ここでは、長くて見た目は悪いが重複することがないので、UUID を指定してマウントする。一方で、デバイス名を /dev/sdb1 で指定すると、デバイスの認識順によっては名前が変わってしまうので、よくない。
      UUID を確認するには、 blkid を実行する。 確認した UUID を使って /etc/fstab に書き込む。OS はファイルの上から順番に実行するので、記述する場所は適当な場所にする (最後でいいと思う)。全部で 6 フィールドあり、それぞれはスペースかタブで区切る。
      1UUID=00000000-0000-0000-0000-000000000000  /backup  ext4  defaults  0  0
      fstab の設定がきちんとなされているか、一旦 umount して以下のコマンドきちんとマウントできるか確かめる。

ジョブ管理関連

torque + maui という組み合わせで使っている。 slurm の方がいいらしいので、今後導入したい、が、今のところこちら。 インストールがうまくいかない。(>_<)

サービスのリスタート

1service pbs_mom restart
2service pbs_server restart
3service maui restart

FTP 関連

  • 基本
    <FTP サーバー> に接続
    1$ ftp [option] <FTP サーバー>
    option
    • -n: ログインセッションを無効で接続。
    • -i: インタラクティブモードをオフで接続。
    <host> に接続する。
    1ftp> open <host>
    転送モードをテキスト (ASCII モード) にする。(デフォルト)
    1ftp> ascii (asc)
    現在のディレクトリの一を表示する
    <ディレクトリ> に移動する。
    1ftp> cd <ディレクトリ>
    ローカル側のディレクトリを移動する
    1ftp> lcd <ディレクトリ>
    <ディレクトリ> をサーバー側に作る。
    1ftp> mkdir <ディレクトリ>
    <ファイル名> を削除する
    1ftp> delete <ファイル名>
    サーバー上の <ファイル名> をローカル上に転送する。
    1ftp> get <ファイル名>
    サーバー上の <複数のファイル名> をローカル上に転送する。
    1ftp> mget <複数のファイル名>
    ローカル上の <ファイル名> をサーバー上に転送する。
    1ftp> put <ファイル名>
    ローカル上の <複数のファイル名> をサーバー上に転送する。
    1ftp> mput <複数のファイル名>
    ftp を終了する。

スクリプトで自動化する。

サンプルスクリプト ($ cat ftpscript.txt)
1open <host>
2user <ユーザー名> <パスワード>
3ascii
4mput <サーバーにアップロードしたいファイル>
5bye
以上だと、パスワードを直接書き込むリスクがあるので、ftpscript.txt の作成を自動化し、パスワードは直接キーボードから入力させる (ファイルはすぐに削除されるが、一旦作られたファイルは暗号化されていないので、セキュリティ的に良くないかも。今後改善。)。自動化サンプルスクリプト ($ cat autoftp.sh)
01#!/bin/sh
02echo "password?"
03stty -echo
04read passwd
05stty echo
06#-----
07cat << EOF > ftpscript.txt
08open <host>
09user <ユーザー名> $passwd
10ascii
11mput <サーバーにアップロードしたいファイル>
12bye
13EOF
14#-----
15ftp -n -i > ftpscript.txt
16rm ftpscript.txt

サンプルスクリプト

解説はともかく使えそうなスクリプトがとりあえずできたら下に置いておく。

点数の分布をグラフにするスクリプト


別に gnuplot をインストールしておくこと。 一列の数値を読み取って、ガウス関数をかけてプロットする。

01#!/bin/sh
02 
03inputfile=score_total.txt
04flag_epsout="#"
05   
06sigma=2.0
07 
08##### usage #####
09function usage_exit() {
10cat << EOF
11Usage: $(echo $(basename $0)) [option]
12  option: --file <file>        : input file <file> (default: $inputfile)
13    --sigma <val>        : set sigma as <val> (default: $sigma)
14    --eps <name>         : output eps file as <name>
15    --line <x1,y1:x2,y2> : plot line from x1,y1 to x2,y2
16    --line2 <x1,y1:x2,y2>: plot line from x1,y1 to x2,y2
17    --show_command       : only show plotting command
18    -h|--help            : show this message
19EOF
20exit 1
21}
22 
23OPT=$(getopt -o h \
24             -l file:,sigma:,eps:,line:,line2:,show_command,help -- "$@")
25[ $? != 0 ] && usage_exit
26   
27eval set -- "$OPT"
28while true; do
29  case $1 in
30    --file) inputfile=$2; shift;;
31    --eps) flag_epsout=""; outeps=$2; shift;;
32    --line) p1=${2%:*}; p2=${2#*:};
33            if [[ -z $p1 || -z $p2 ]]; then usage_exit; fi
34            shift;;
35    --line2) q1=${2%:*}; q2=${2#*:};
36             if [[ -z $q1 || -z $q2 ]]; then usage_exit; fi
37             shift;;
38    --sigma) sigma=$2; shift;;
39    --show_command) flag_show_command=1;;
40    -h|--help) usage_exit;;
41    --) shift; break;;
42  esac
43  shift
44done
45shift $(( OPTIND -1 ))
46 
47#--- create ploting command -----
48pl_exe=$(cat $inputfile | awk '{printf "+ exp\(-\(\(x - %15.7e\)/\(sqrt\(2\)*'$sigma'\)\)\*\*2\) ", $1}')
49 
50pl_exe=${pl_exe#+}
51pl_exe=${pl_exe%,*}
52pl_exe="pl ${pl_exe}"
53 
54 
55pl_exe="$pl_exe, '$inputfile' u (\$1):(0.5) lc 3 w boxes"
56   
57if [[ ! -z $flag_show_command ]]; then
58  echo $pl_exe
59  usage_exit
60fi
61 
62if [[ ! -z $p1 ]]; then
63  pl_line="set arrow from $p1 to $p2 nohead lw 0.1 lc rgb 'black'; \
64  set xtics add ('${p1%,*}' ${p1%,*})"
65fi
66if [[ ! -z $q1 ]]; then
67  pl_line2="set arrow from $q1 to $q2 nohead lw 0.1 lc rgb 'red'; \
68  set xtics add ('${q1%,*}' ${q1%,*})"
69fi
70   
71gnuplot -persist <<EOF
72   
73${flag_epsout}set ter post color eps enhance 20
74${flag_epsout}set out '$outeps'
75 
76unset key
77   
78set boxwidth 0.5 absolute
79set style fill solid
80 
81set xlabel 'score'
82set ylabel '~ number of people'
83 
84set yrange[0:*]
85set xrange[0:100]
86 
87set samples 1000
88 
89$pl_line
90$pl_line2
91     
92$pl_exe
93   
94EOF
95 
96if [[ -z $flag_epsout ]]; then
97  gv $outeps &
98fi

正多角形を描くスクリプト


正三角形
正方形
正五角形
正六角形
正七角形

別に gnuplot をインストールしておくこと。

1./polygon.sh -n <整数>
などとすることで半径 1 の円とそれに内接する 正<整数>角形 を描き、右端の頂点からその他の頂点に直線を引くスクリプト。自動的に、Safari.app を開いて描けた図を表示する (最後の行は、Mac 用)。

01#!/bin/sh
02 
03### output parameters ###
04base=$(basename $0); base=${base%.plt}
05 
06datapol=/tmp/datapolygon.dat
07datadia=/tmp/diagonal.dat
08 
09pi=3.1415926535897932384626433832795
10 
11##### usage #####
12function usage_exit() {
13cat << EOF
14Usage: $(echo $(basename $0)) [option] param
15  param:  -n|--num <integer>: set number of vertex
16  option: -h|--help         : show this message
17EOF
18exit 1
19}
20 
21OPT=$(getopt -o n:,h \
22             -l num:,help -- "$@")
23[ $? != 0 ] && "$OPT"
24eval set -- "$OPT"
25while true; do
26  case $1 in
27    -n|--num) numvertex=$2; shift;;
28    -h|--help) usage_exit;;
29    --) shift; break;;
30  esac
31  shift
32done
33shift $(( OPTIND -1 ))
34 
35if [[ -z $numvertex ]]; then
36  echo "set the number of vertex: -n <num>"
37  usage_exit
38fi
39 
40outputfile="$(basename $base .sh)_$numvertex.svg"
41 
42### making tables ###
43## polygon ##
44echo "#x, y" > $datapol
45for (( deg=0; deg<=$numvertex; deg++ )); do
46  awk 'BEGIN{printf "%f, %f\n", cos(2*'$pi'/'$numvertex'*'$deg'), sin(2*'$pi'/'$numvertex'*'$deg')}' >> $datapol
47done
48## diagonal line ##
49echo "#x, y" > $datadia
50for (( deg=1; deg<$numvertex; deg++ )); do
51  awk 'BEGIN{printf "%f, %f\n", cos(2*'$pi'/'$numvertex'*'$deg'), sin(2*'$pi'/'$numvertex'*'$deg')}' >> $datadia
52  awk 'BEGIN{printf "%f, %f\n", 1, 0}' >> $datadia
53done
54 
55gnuplot << EOF
56### vector functios ###
57Fx(t) = cos(t)
58Fy(t) = sin(t)
59 
60### ploting range ###
61set xrange[-1:1]
62set yrange[-1:1]
63 
64### visual ###
65set nokey
66set size square
67set zeroaxis ls -1
68 
69set xtics 1
70set ytics 1
71### sampling points ###
72 
73 
74 
75### plot & save ###
76#set ter post color eps enhanced 25
77#set ter png
78set ter svg fsize 25
79set out "$outputfile"
80 
81set parametric
82pl Fx(t), Fy(t) w l lw 2 lc -1, \
83  "$datapol" w l lw 4 lc 1, \
84  "$datadia" w l lw 2 lc 3
85 
86### view a plot in x11 ###
87#set ter x11 font 25
88#pl 1,1 w p ps 1 pt 7
89EOF
90 
91### open svg file ###
92rm $datapol
93open -a safari.app $outputfile &
to the top