teketeke_55の日記

技術メモとか

shell関連memo

キーボードショートカット

  • 「Ctrl」+「S」でキー入力が受け付けられなくなる~

「Ctrl」+「Q」で解除

bashスクリプト内のインクリメント、デクリメント

他の言語のように++num などが使えないのでlet関数を使う

 let ++num
 let --num

配列について [#k96b8e7a]

要素の参照

${array[0]}
 ${array[1]}

要素の代入

 array[0]=1
 array[0]=2

配列の要素の個数

 declare -i array_num=${#array[@]}

配列の操作

 declare -a array=(1 2 3)

先頭を取り出す

 first="${array[0]}"            # firstは1
 array=("${array[@]:1}")        # arrayは(2 3)

先頭に追加

 array=(5 "${array[@]}")        # arrayは(5 2 3)

末尾を取り出す

 
declare -i num=${#array[@]}-1
 last="${array[$num]}"          # lastは3 
 array=("${array[@]:0:$num}")   # arrayは(5 2)

末尾に追加

 array=("${array[@]}" 9)        # arrayは(5 2 9)

lsof 使い方 [#z2b7b1b0]

 lsof - list open files
  • pオプションでプロセスID指定

# プロセスID指定

 lsof -p 12345

#バッククォート使う
>||
lsof -p `pgrep -n httpd`
|

  • cオプションでプロセス名指定
 lsof -c httpd

\-uオプションでユーザ指定

 lsof -u hoge

listenしてるポートを出力。指定したポートのみ表示することもできる。

 lsof -i           # Listenしてるのずらずら表示
 lsof -i :22       # ssh
 lsof -i :22,80    # ssh or http
 lsof -i :http     # 名前でもいける
 lsof -i @192.168.0.1    # interface指定
 lsof -i @192.168.0.1:80 # interfaceとポート指定
  • aオプションでAND

オプション複数指定するとORで出力されるようです。なのでプロセスとユーザの両方を指定したいときは-aをつける。

 lsof -a -u hoge -c java


ファイルシステムを指定
オプションなしでファイルシステム(ディレクトリ、ファイル)を指定すると、そのファイルシステムを使用中のプロセスが出てきます。例えば、こんなときに使う。(パスは絶対パスで指定する必要あり)

 root # umount /media/cdrom
 umount: /media/cdrom0: デバイスを使用中です
 umount: /media/cdrom0: デバイスを使用中です

split 使い方 [#f9701890]

ファイルのサイズが大きくてメディアに収まりきれないときに使うとよい

 split -b 1000m file file. ←fileをを1GBbytesずつに分割

くっつけるとき

 cat file1 file2 > file

tar: Removing leading `/' from member names

メッセージが出た時の対処方法

tarは基本的に相対パスで実行される。~
そのため絶対パスで指定された場合に警告が出る。~
(圧縮自体は問題なし)~
絶対パスをで進めたい場合は-Pオプションを付けて実行すればよい

ハードウェア情報を調べるコマンド

dmidecode~

例:メモリの情報を抽出する

 # dmidecode --type memory

typeはいろいろ

 bios
 system
 baseboard
 chassis
 processor
 memory
 connector
 slot 

引数を付けないでやると全部出るのでgrepしてもよし。~
/proc/meminfo とかよりも詳細な情報がでることもあるのでいろいろ試してみよう

文字コード変換

iconv
 iconv -f=utf8 -t=sjis < 元ファイル > 変換後ファイル名

元ファイルの文字コードを utf8 とみなし、Shift_JIS に変換して出力。

 iconv --list

⇒ 使用可能な文字コード一覧を表示 (GNU の iconv で確認)

nkf

nkf -e 元ファイル > 変換後ファイル名
|

-e 変換結果をEUC-JPで出力する
-j 変換結果をISO-2022-JPで出力する
-s 変換結果をShift-JISで出力する
-u 変換結果のバッファリングを行わない
|

DISKの追加とか

 mkfs -t ext3 /dev/sda2

 mkdir -p /disk2

 mount -t ext3 /dev/sda1 /disk2

引用元
http://saminnet.dip.jp/servercomputer/Lmemo/pub/boot_scsi.html~
http://d.hatena.ne.jp/interu/20081215/1229336594

DISKの速度を調べる

 hdparm -ft /dev/mapper/VolGroup00-LogVol00

プロセスごとのDISK I/Oを調べる

iotop

  • d で間隔指定~

方向キーで優先順位の変更ができる~
インストールされていない場合はepelからyumで入れる

wgetやscpに帯域制限をかける

wget

・--limit-rateのオプションで制御可能。単位はbyte/秒

 wget --limit-rate=100000 http://XXXXXX.com/aaa.tgz

これで100KB/秒で転送。

scp

・-lオプションで制御可能。単位はKbit/秒
scp -l 800 root@XXXXXX.com:/aaa/aaa.tgz ./
|

これで100KB/秒で転送。

rsync

・--bwlimitオプションで制御可能。単位はKbyte/秒

 rsync -av --bwlimit=200 root@XXXXXX.com:/aaa/ ./aaa/

これで200KB/秒で転送。

引用元:http://d.hatena.ne.jp/isher/20080817/1218996948

faillog [#g29302b0]

ログイン失敗をみるコマンド~
/var/log/faillog~
を整形して表示する~
使用例~
ユーザーを指定して確認

 faillog -u test

全ユーザーを指定して確認

 faillog -a

yum [#s5217740]

  • 失敗して壊れた時の対応

yumやRPM中にシャットダウンなどすると以下のようなメッセージが表示され正常に起動しなくなる。

 rpmdb: PANIC: fatal region error detected; run recovery
 エラー: db4 error(-30978) from dbenv->

復旧するには以下のファイルを削除するか移動する

 # ls -l /var/lib/rpm/__db.00?
 -rw-r--r--  1 rpm  rpm     90112 11月 14 19:51 Sigmd5
 -rw-r--r--  1 rpm  rpm     12288 11月 14 19:50 Triggername
 -rw-r--r--  1 root root    16384 12月  5 09:02 __db.001
 -rw-r--r--  1 root root  1318912 12月  5 09:02 __db.002
 -rw-r--r--  1 root root   450560 12月  5 09:02 __db.003
 # mv /var/lib/rpm/__db.00? /tmp

rpmを再ビルド
>||
# rpm --rebuilddb
|

yumを起動して動作確認する

sar [#t4c985de]

  • 過去分を日付指定でみる
 sar -f /var/log/sa/sa15

※最後は日付をmmで記載
いつも通り他のオプションの指定も可能(-r -u -qとか)

unmount できないとき [#o47e3b75]

busyとでてumountができない時がある。その際はオプションに -l を付けてやるとできることが多い

 umount -l /mnt

awk [#y47ec4ac]

後ろから取り出すにはNFを使う

 awk '{print $(NF -3)}' ※後ろから3番目のフィールドをprint

find [#md4aac68]

検索、表示する階層を指定する。

-maxdepth [arg]

上から[arg]分の階層を除外

-maxdepth [arg]

下から[arg]分の階層を除外

 find /tmp/ -maxdepth 2 -mindepth 1 -ctime -1

dateコマンドのGNU版とBSD版の違い [#x4ec59c4]

BSD版 [#mf61b295]
 $ date -help
 
 date: illegal option -- h
 usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]
GNU版 [#pddc4c4e]
  $ date --help
 使用法: date [OPTION]... [+FORMAT]
 または: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
 Display the current time in the given FORMAT, or set the system date.

  -d, --date=STRING         display time described by STRING, not `now'
  -f, --file=DATEFILE       like --date once for each line of DATEFILE
  -I[TIMESPEC], --iso-8601[=TIMESPEC]  output date/time in ISO 8601 format.
                            TIMESPEC=`date' for date only (the default),
                            `hours', `minutes', `seconds', or `ns' for date
                            and time to the indicated precision.
  -r, --reference=FILE      FILE の最終変更時刻を表示する
  -R, --rfc-2822            RFC 2822 形式で日付と時刻を出力する
                            例: Mon, 07 Aug 2006 12:34:56 -0600
      --rfc-3339=TIMESPEC   RFC 3339 形式で日付と時刻を出力する
                            TIMESPEC=`date', `seconds' または `ns' で
                            示す日付、時刻の精度になる。
                            日付と時刻は単一のスペースで区切られ、次
                            のようになる: 2006-08-07 12:34:56-06:00
  -s, --set=STRING          STRING で記述される時間に設定する
  -u, --utc, --universal    UTC (協定世界時) 時間を表示または設定する
      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する
||<      
***日付指定する場合 [#a19cf1a1]
10日前
BSD版
>||
   date -v-10d 

GNU

  date -d '10 days ago'