Linuxめも

■まとめて処理するコマンド
pkill … 引数1にマッチしたプロセスIDにシグナルを送る。
pgrep … 引数1にマッチしたプロセスIDを列挙する。
pstree … プロセスの階層を表示する。

 

標準エラー出力をパイプ渡す。
# 標準出力と標準エラー出力の両方をパイプで渡す
$ hoge.sh 2>&1 | sort | uniq

 

# 標準エラー出力のみをパイプで渡す
$ hoge 2>&1 > /dev/null | sort | uniq

 

■(Linux)コマンドを連結して行う「;」「&」「&&」「||」の違い
&&
前のコマンドがうまく終了した(終了ステータスが0)なら、次のコマンドを実行。そうでないなら次のコマンドは実行しない。
#configureが成功したらmake,makeが成功したらmake installする
configure && make && make install

 

#/home/a.txtがあれば cp コマンドでコピーする
[ -f /home/a.txt ] && cp /home/a.txt /var/bkup

 

||
&&とは逆で前のコマンドに失敗(終了コード0以外)したら、次のコマンドを実行する。
#command1が失敗したら指定したディレクトリ削除
command1 || rm -rf /home/hoge/tmp

 

■{[0-9]*}
{} , {0} , {1000} , {12345678} など、{} 内に0個以上の数字がある文字列にマッチします。

 

■パイプのステータスを取得する。$?は最後の結果のみ。
# true | true | false; echo ${PIPESTATUS[0]}
0
# true | true | false; echo ${PIPESTATUS[1]}
0
# true | true | false; echo ${PIPESTATUS[2]}
1

 

■一時ファイル不要のdiff(プロセス置換を使って一時ファイルを生成せずに置換)
diff <(sort file1.txt|uniq) <(sort file2.txt|uniq)
diff <(cat chklog.sh) <(cat chkres.sh )

 

■プロセス置換を使ってその後のログファイル出力を制御
以下のようにすると以降のコマンド実行結果は全てログにも出力される。

 

ログ出力
# 標準出力
exec 1> >(tee -a out.log)
# 標準エラー出力
exec 2> >(tee -a err.log >&2)

 

■バイナリデータをsarで読む
sar -f /var/log/sa/saDD 
※/var/log/sa/sarDD はテキスト

 

■sarでバイナリデータ出力後、テキスト書式に変換する方法
sadf -T -- -A sar.out >sadf.txt

 

■viで大文字⇒小文字変換
s/[A-Z]/?L&/g

 

■tail -f をパイプでgrepするとバッファに保存されてしまう場合、リアルタイムに出す方法。
tail -f /home/hoge/hoge.log | grep --line-buffered "error" 

 

■tail -fでリアルタイムに文字コード変換
$ tail -f logfile | while read LINE ; do echo $LINE | iconv -f SJIS -t UTF-8 ; done
もしくは
$ tail -f logfile | nkf -u -S -w

 

■shellで2次元配列を使う。
#!/bin/sh
for *1 {
for *2 {
eval ARRAY${x}${y}=\$RANDOM
}
}
 
for *3 {
for *4 {
RESULT=`eval echo \\$ARRAY${x}${y}`
echo $RESULT
}
}

 

■空の配列を生成する
array=()
--
declare -a array=() # 宣言
declare -a array=("a" "b" "c") # 初期化
--
some_func() {
local local_array=() # 関数内スコープは local で定義
}

 

■ 配列の要素数
echo ${#array[@]} # 3
echo ${#array[*]} # 3

 

■ 配列のデータを追加
# 先頭に追加
array=(3 "${array[@]}") # array は (3 “a” "b" "c")
# 末尾に追加
array=("${array[@]}" 4) # array は (3 "a" "b" "c" 4)
array+=( 5 ) # array は (3 "a" "b" "c" 4 5)

 

■ 配列からデータを取り出す
# データの先頭要素を取り出す(破壊的操作)
array=("${array[@]:1}") # array は ("a" "b" "c" 4 5)
# データの末尾要素取り出す(破壊的操作)
declare -i num=${#array[@]}-1
array=("${array[@]:0:$num}") # array は ("a" "b" "c" 4)
# 一行
array=(${array[@]:0:*5}) # array は ("a" "b" "c")

 

■ 配列のデータを参照する
i=0
for e in ${array[@]}; do
echo "array[$i] = ${e}"
let i++
done
array[0] = a
array[1] = b
array[2] = c

 

# C言語風に記述する
for *6 {
echo "array[$i] = ${array[i]}"
}
array[0] = a
array[1] = b
array[2] = c

 

# Bash 独自の記述 1
echo "${array[@]}"
a b c

 

# Bash 独自の記述 2
IFS=$'\n'
echo "${array[*]}"
a
b
c

 

■ 配列のデータから任意の要素を削除する
# ある要素を削除
unset array[1]
echo "${array[@]}" # arrayは("a" "c")
echo ${array[0]} # array[0]は"a"
echo ${array[1]} # array[1]は ""(空)
echo ${array[2]} # array[2]は"c"
配列の中身のデータは削除できても、配列自体は削除できない。
添字を詰めたければ、
array=("${array[@]}"
代入しなおす必要があり。

 

unset array[@] # 全削除する
echo "${array[@]}" # 配列 array は ""(空)
echo "${#array[@]}" # 要素数は0

 

■ 配列にデータを格納する
array[0]=1
array[1]="a"

 

■hangup時に強制的にkdumpを行って再起動する操作:(マジックキー)
Alt+SysRq+c (カーネルをクラッシュさせる)->crash時にkdumpが吐ける設定になっていないと意味がない。
Alt+SysRq+b 即座に再起動

 

チルダ問題メモ
FULL WIDTH TILDE(15711646)とWAVE DASH(14909596)を切りかえて再調査。WAVE_DASHは済み。

 

LinuxでNTPサーバと時刻同期していることを確認する方法。
ntpq -p

 

remote refid st t when poll reach delay offset jitter
==============================================================================
*10.XX.X.XXX LOCAL(0) 6 u 423 1024 377 1.758 -0.275 1.677
LOCAL(0) LOCAL(0) 5 l 64 64 377 0.000 0.000 0.008 
remoteのところにつき記号の意味は以下の通り。
*:現在参照同期中のサーバ
+:現在クロック誤り検査に合格したサーバ
#:現在参照同期中ですが,距離が遠いサーバ
:現在参照していないサーバ (空白)
x:現在クロック誤り検査で不合格になったサーバ
.:現在参照リストからはずされたサーバ

 

■NTPサーバと時刻合わせ
ntpdate NTPサーバ

 

CentOSでhwclockをlocaltimeに設定する方法(9時間差を補正する)
# timedatectl
# hwclock -s --localtime
# timedatectl set-local-rtc true

 

systemd-timedated が /etc/adjtime を読み込む。このファイルの3行目がhwclockがUTCかLOCALかを設定。systemd-timedatedがそれを見て、システムクロックをUTCかLOCALに設定する。timedatectl set-local-rtc true で当該ファイル3行目をLOCALに変更する。3行目がないとUTCと判断してにする模様。
1行目は、時刻の補正やズレ、2行目は、時刻合わせ後の経過秒数。0は未実施か、異常であった場合の模様。

 

・/etc/adjtime
# more /etc/adjtime
0.0 0 0.0
0
LOCAL

 

■ハードウェアクロック確認
# hwclock --show
# hwclock --show --utc
# hwclock --show --localtime

 

タイムゾーン変更
# mv /etc/localtime{,.org}
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

 

■CentOS7で rootユーザのパスワードリセット
wheelグループのユーザでログインし以下を実行する。
$ sudo passwd root

 

GRUB 2ではシングルユーザモード(エマージェンシーモードも同様)でもrootユーザのパスワードが要求される模様。

 

Linuxにおける変数の設定

 

/etc/environment ファイル
ログイン時にOSが最初に使用するファイル。すべてのプロセス用の基本的な変数を記述。
シェルセッションを起動するさまざまなプログラムが /etc/environment ファイルを使う。組織で利用するHTTP_PROXY環境変数等に使う。

 

/etc/profile ファイル
ログイン時にOSが使用する 2 番目のファイル。
bash は対話型シェル用に /etc/bash.bashrc を使い、ログインシェル用に /etc/profile を使う。

 

.profile ファイル
$HOMEにあり、個々の作業環境をカスタマイズ。
bashの場合、~/.bashrc と ~/.bash_profile で、alias等を設定する。

 

.env ファイル
OSがログイン時に使用する 4 番目のファイル。.profile に export ENV=$HOME/.env の行が含まれている場合は、.env ファイル。

 

全シェルを同様設定にする
~/.bash_profile ファイルの中で ~/.bashrc の内容を実行 またはsourceする。
全ユーザで行う場合は、/etc/profile の中で /etc/bash.bashrc を呼ぶ。

 

■ログイン画面で、SHIFT+CTRL+F1をおすと、CUIの画面が開くことができる。

 

■/etc/environment例
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
LANGUAGE=ja_JP:en
LANG=ja_JP.UTF-8
LC_MESSAGES=ja_JP.UTF-8
LC_CTYPE=ja_JP.UTF-8
LC_COLLATE=ja_JP.UTF-8

 

■/etc/default/locale例
LANG=ja_JP.UTF-8
LANGUAGE=ja_JP:en
LC_MESSAGES=ja_JP.UTF-8
LC_CTYPE=ja_JP.UTF-8
LC_COLLATE=ja_JP.UTF-8

 

■/etc/pam.d/gdm例
auth required pam_env.so readenv=1 envfile=/etc/default/locale

 

■名前変更、コピー
mv hoge{,.too}
cp hoge{,.too}

 

vmware-toolsを手動でマウントする場合
vmhgfs-fuse .host:/ /mnt/hgfs

 

永続化したい場合、/etc/fstabを以下に変更

 

.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other 0 0

*1: x = 0; x <= 2; x++

*2: y = 0; y <= 2; y++

*3: x = 0; x <= 2; x++

*4: y = 0; y <= 2; y++

*5:${#array[@]}-1

*6:i = 0; i < ${#array[@]}; i++