Linuxめも
■まとめて処理するコマンド
pkill … 引数1にマッチしたプロセスIDにシグナルを送る。
pgrep … 引数1にマッチしたプロセスIDを列挙する。
pstree … プロセスの階層を表示する。
pkill … 引数1にマッチしたプロセスIDにシグナルを送る。
pgrep … 引数1にマッチしたプロセスIDを列挙する。
pstree … プロセスの階層を表示する。
■(Linux)コマンドを連結して行う「;」「&」「&&」「||」の違い
&&
前のコマンドがうまく終了した(終了ステータスが0)なら、次のコマンドを実行。そうでないなら次のコマンドは実行しない。
#configureが成功したらmake,makeが成功したらmake installする
configure && make && make install
&&
前のコマンドがうまく終了した(終了ステータスが0)なら、次のコマンドを実行。そうでないなら次のコマンドは実行しない。
#configureが成功したらmake,makeが成功したらmake installする
configure && make && make install
#/home/a.txtがあれば cp コマンドでコピーする
[ -f /home/a.txt ] && cp /home/a.txt /var/bkup
[ -f /home/a.txt ] && cp /home/a.txt /var/bkup
||
&&とは逆で前のコマンドに失敗(終了コード0以外)したら、次のコマンドを実行する。
#command1が失敗したら指定したディレクトリ削除
command1 || rm -rf /home/hoge/tmp
&&とは逆で前のコマンドに失敗(終了コード0以外)したら、次のコマンドを実行する。
#command1が失敗したら指定したディレクトリ削除
command1 || rm -rf /home/hoge/tmp
■{[0-9]*}
{} , {0} , {1000} , {12345678} など、{} 内に0個以上の数字がある文字列にマッチします。
{} , {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
# 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 )
diff <(sort file1.txt|uniq) <(sort file2.txt|uniq)
diff <(cat chklog.sh) <(cat chkres.sh )
■プロセス置換を使ってその後のログファイル出力を制御
以下のようにすると以降のコマンド実行結果は全てログにも出力される。
以下のようにすると以降のコマンド実行結果は全てログにも出力される。
■バイナリデータをsarで読む
sar -f /var/log/sa/saDD
※/var/log/sa/sarDD はテキスト
sar -f /var/log/sa/saDD
※/var/log/sa/sarDD はテキスト
■sarでバイナリデータ出力後、テキスト書式に変換する方法
sadf -T -- -A sar.out >sadf.txt
sadf -T -- -A sar.out >sadf.txt
■viで大文字⇒小文字変換
s/[A-Z]/?L&/g
s/[A-Z]/?L&/g
■tail -f をパイプでgrepするとバッファに保存されてしまう場合、リアルタイムに出す方法。
tail -f /home/hoge/hoge.log | grep --line-buffered "error"
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
$ tail -f logfile | while read LINE ; do echo $LINE | iconv -f SJIS -t UTF-8 ; done
もしくは
$ tail -f logfile | nkf -u -S -w
■空の配列を生成する
array=()
--
declare -a array=() # 宣言
declare -a array=("a" "b" "c") # 初期化
--
some_func() {
array=()
--
declare -a array=() # 宣言
declare -a array=("a" "b" "c") # 初期化
--
some_func() {
local local_array=() # 関数内スコープは local で定義
}■ 配列のデータを追加
# 先頭に追加
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=(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:((${#array[@]}-1))}) # array は ("a" "b" "c")
# データの先頭要素を取り出す(破壊的操作)
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:((${#array[@]}-1))}) # array は ("a" "b" "c")
■ 配列のデータを参照する
i=0
for e in ${array[@]}; do
array[0] = a
array[1] = b
array[2] = c
i=0
for e in ${array[@]}; do
echo "array[$i] = ${e}"
let i++
donelet i++
array[0] = a
array[1] = b
array[2] = 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[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[@]}"
代入しなおす必要があり。
■ 配列にデータを格納する
array[0]=1
array[1]="a"
array[0]=1
array[1]="a"
■hangup時に強制的にkdumpを行って再起動する操作:(マジックキー)
Alt+SysRq+c (カーネルをクラッシュさせる)->crash時にkdumpが吐ける設定になっていないと意味がない。
Alt+SysRq+b 即座に再起動
Alt+SysRq+c (カーネルをクラッシュさせる)->crash時にkdumpが吐ける設定になっていないと意味がない。
Alt+SysRq+b 即座に再起動
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サーバ
ntpdate NTPサーバ
■CentOSでhwclockをlocaltimeに設定する方法(9時間差を補正する)
# timedatectl
# hwclock -s --localtime
# timedatectl set-local-rtc true
# 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は未実施か、異常であった場合の模様。
1行目は、時刻の補正やズレ、2行目は、時刻合わせ後の経過秒数。0は未実施か、異常であった場合の模様。
・/etc/adjtime
# more /etc/adjtime
0.0 0 0.0
0
LOCAL
# more /etc/adjtime
0.0 0 0.0
0
LOCAL
■CentOS7で rootユーザのパスワードリセット
wheelグループのユーザでログインし以下を実行する。
$ sudo passwd root
wheelグループのユーザでログインし以下を実行する。
$ sudo passwd root
※GRUB 2ではシングルユーザモード(エマージェンシーモードも同様)でもrootユーザのパスワードが要求される模様。
■Linuxにおける変数の設定
/etc/environment ファイル
ログイン時にOSが最初に使用するファイル。すべてのプロセス用の基本的な変数を記述。
シェルセッションを起動するさまざまなプログラムが /etc/environment ファイルを使う。組織で利用するHTTP_PROXY環境変数等に使う。
ログイン時にOSが最初に使用するファイル。すべてのプロセス用の基本的な変数を記述。
シェルセッションを起動するさまざまなプログラムが /etc/environment ファイルを使う。組織で利用するHTTP_PROXY環境変数等に使う。
/etc/profile ファイル
ログイン時にOSが使用する 2 番目のファイル。
bash は対話型シェル用に /etc/bash.bashrc を使い、ログインシェル用に /etc/profile を使う。
ログイン時にOSが使用する 2 番目のファイル。
bash は対話型シェル用に /etc/bash.bashrc を使い、ログインシェル用に /etc/profile を使う。
.env ファイル
OSがログイン時に使用する 4 番目のファイル。.profile に export ENV=$HOME/.env の行が含まれている場合は、.env ファイル。
OSがログイン時に使用する 4 番目のファイル。.profile に export ENV=$HOME/.env の行が含まれている場合は、.env ファイル。
全シェルを同様設定にする
~/.bash_profile ファイルの中で ~/.bashrc の内容を実行 またはsourceする。
全ユーザで行う場合は、/etc/profile の中で /etc/bash.bashrc を呼ぶ。
~/.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
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
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
auth required pam_env.so readenv=1 envfile=/etc/default/locale
永続化したい場合、/etc/fstabを以下に変更