ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2016-10-05

restart dhclient without OS reboot

yum updateを実施したところdhclientがdeletedな状態となってしまいました
# lsof|grep del
dhclient   2292      root  txt      REG       202,1    547784   402927 /sbin/dhclient (deleted)

いろいろと調べて、最終的に辿り着いた対応方法がこれ

# service network reload
Shutting down interface eth0:       [  OK  ]
Shutting down loopback interface:      [  OK  ]
Bringing up loopback interface:       [  OK  ]
Bringing up interface eth0:  
Determining IP information for eth0... done.
          [  OK  ]
# lsof|grep del

瞬断はあるものの、接続中のセッションが切れることもなくdeleted状態から抜け出せましたヾ(*・∀・)ノ"

agettyを再起動する方法

yum updateしたら、どうもagettyが更新されたようでdeletedな状態となってしまいました。
# lsof|grep del
agetty    2777      root  txt      REG       202,1 36184   401041 /sbin/agetty (deleted)

OSごと再起動してしまえば済むのでしょうけれど、OSは再起動せずにagettyだけ再起動できないものかと

restart agetty

みたいな感じでぐぐってみるもなかなか対処方法にたどり着きませんでした。



そして、最終的にたどり着いた方法がこれ

# initctl list
...中略...
serial (ttyS0) start/running, process 2777
# initctl status serial DEV=ttyS0
serial (ttyS0) start/running, process 2777
# initctl restart serial DEV=ttyS0
serial (ttyS0) start/running, process 27704
# lsof|grep del

agettyが再起動され、deleted状態から抜け出しましたヽ(´ー`)/

2016-04-25

psコマンドでCPU使用率、メモリ使用率で降順ソートする

CPU使用率はcpuではなくpcpu、メモリ使用率はrssでそれぞれ-をつけてあげると降順ソートされるのですねヾ(*・ω・)シ

$ ps aux --sort -pcpu|head -4
USER    PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root  27481 4.9  0.0 417760  5504 ?        Sl   Apr04 1484:06 xxx
lumata  21324 0.4  0.1 386072 10636 ?        Sl    2015 1361:06 xxx
root      1 0.0  0.0  19456  1472 ?        Ss    2015   2:09  xxx

$ ps aux --sort -rss|head -4
USER    PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME  COMMAND
root  12295 0.0  0.2 366620 18220 ?        SN    2015   5:39  xxx
lumata  21324 0.4  0.1 386072 10636 ?        Sl    2015 1361:06 xxx
root  23780 0.0  0.1 155064  9088 ?        Ss    2015  16:09  xxx

2015-03-20

sudo初回実行時のレクチャメッセージを改めて表示する

■Cent OS 6.xの場合
# find / -name <ユーザ名>
/var/spool/mail/<ユーザ名>
/var/db/sudo/<ユーザ名>
/home/<ユーザ名>
な感じでひっかかってくるので
# rm -rf /var/db/sudo/<ユーザ名>

■Cent OS 5.xの場合
# find / -name <ユーザ名>
/var/spool/mail/<ユーザ名>
/var/run/sudo/<ユーザ名>
/home/<ユーザ名>
な感じでひっかかってくるので
# rm -rf /var/run/sudo/<ユーザ名>

これでsudoを実行すると改めて表示されます

2014-12-15

シェルスクリプトで、現在の関数名と呼び出し元の関数名を参照する

${FUNCNAME[0]}で現在実行中の関数名

${FUNCNAME[1]}で呼び出し元の関数名を参照できる

サンプルコードはこんな感じ
#! /bin/sh
func1(){
 echo ${FUNCNAME[0]}
 echo ${FUNCNAME[1]}
}

func2(){
 echo ${FUNCNAME[0]}
 echo ${FUNCNAME[1]}
}

caller(){
 func1
 func2
}

caller

実行すると
$ ./test.sh 
func1
caller
func2
caller

2014-11-05

シェルスクリプトで変数展開時に値の置換/削除処理を行う

記述動作対応するsedコマンド例
${変数名#*c}前方一致でのマッチ部分削除(最短マッチ)sed "s/^.*?c//"
${変数名##*c}前方一致でのマッチ部分削除(最長マッチ)sed "s/^.*c//"
${変数名%*c}後方一致でのマッチ部分削除(最短マッチ)sed "s/.*?c$//"
${変数名%%*c}後方一致でのマッチ部分削除(最長マッチ)sed "s/.*c$//"
${変数名/*c/def}文字列置換(最長マッチで最初にマッチしたもののみ)sed "s/.*c/def/"
${変数名//*c/def}文字列置換(最長マッチでマッチしたものすべて)sed "s/.*c/def/g"

置換時の最短マッチの書き方は不明・・・

*cだとabcabcに対してabcではなくabcabc全体にマッチしてしまう(´・ω・`)

スクリプト内部で子プロセスをバックグラウンド実行し、親プロセスと一緒に終了する

子プロセスはバックグラウンドで動作し、1秒おきに.を出力

親プロセスとしては、10秒間スリープして"finish."を表示するというもの

スクリプトの中身はこんな感じ

$ cat test.sh 
#! /bin/bash
ppid=$$
while( ps -p $ppid > /dev/null 2>&1 );do
  echo -n "."
  sleep 1
done &

sleep 10
echo -e "\nfinish."

実行するとこうなる
$ ./test.sh 
..........
finish.
親プロセスが終了すると、バックグラウンドで実行していた.を出力する子プロセスも終了してますねヾ(*・∀・)ノ"

シェルスクリプトで変数に格納した改行を扱う

変数msgに改行を含む値を格納してみる
$ msg="a
> b
> c"
これを表示してみると
$ echo $msg
a b c
といった具合に半角スペースに置換されてしまっている

改行として表示するにはダブルクォーテーションで括ってあげる必要があるらしー
$ echo "$msg"
a
b
c

2014-11-04

Linux ssh client設定でセッションを切られないようにする

Linuxからコマンドラインでssh接続したまま席を外していると

戻ってきたときに接続が切れていてイラッっとくることが多々あったので

クライアント側の設定でなんとかできないものかと調べてみました。

自分のホームディレクトリの.ssh/configに次のような設定をしてあげればOKです。
$ cat ~/.ssh/config
Host *
    ServerAliveInterval 100
    ServerAliveCountMax 2

この例だと100秒ごとにサーバに対して「生きてるよー」ってメッセージを送り

サーバの応答が無い場合は、2回まで繰り返して100秒×2回=200秒で切断する

という具合の設定。

これでイラッとすることがなくなりましたヾ(*・∀・)ノ"

環境によってsortコマンドの結果が異なる件

CentOS 5からCentOS 6にリモート接続して、sortコマンドで並べ替えを行ってみたところ

CentOS 6上でsortした結果とリモート接続してsortした結果が異なってしまい嵌ったので解決策をφ(・ω・ )メモメモ

元ファイル
[centos6] $ cat /tmp/test
a
"
z
/
_

CentOS 6上でのsort結果
[centos6] $ sort /tmp/test
_
/
"
a
z

CentOS 5 -> CentOS 6へリモートコマンド実行kした際のsort結果
[centos5] $ ssh centos6 "sort /tmp/test"
"
/
_
a
z

と、いう感じで記号の並び順が異なってしまっている。

リモートコマンドで実行していることが原因なのかと思い、同一のファイルをCentOS 5上にも作成してCentOS5上でのsort結果も試してみた
[centos5] $ sort /tmp/test
"
/
_
a
z

どうやら、リモート実行だからという訳では無いようで実行元の環境に依存している雰囲気でした。

いろいろと試行錯誤してたどり着いた解決策はこれ→LC_ALL=Cをsortコマンドの前に指定してあげる

CentOS 6上でのsort結果
[centos6] $ LC_ALL=C sort /tmp/test
"
/
_
a
z

CentOS 5 -> CentOS 6へリモートコマンド実行kした際のsort結果
[centos5] $ ssh centos6 "LC_ALL=C sort /tmp/test"
"
/
_
a
z

これで無事sort結果がそろいましたヾ(*・∀・)ノ"

2014-09-29

bashで排他制御を実現する

まずはテストファイルを作成
$ seq 10 > /tmp/test
$ cat /tmp/test
1
2
3
4
5
6
7
8
9
10

ここから先頭行を取り出して/tmp/resultに追記し、先頭行を削除するという処理を10回実施してみる

■ダメな例
※/tmp/testから10行削除は成功しているが、抽出して/tmp/resultに追記した値が削除した行と一致していない
$ for i in `seq 10`
do
  head -1 /tmp/test >> /tmp/result;sed -i '1d' /tmp/test &
done
[1] 28066
[2] 28068
[1]-  終了      sed -i '1d' /tmp/test
[3] 28070
[2]-  終了      sed -i '1d' /tmp/test
[4] 28072
[3]-  終了      sed -i '1d' /tmp/test
[4]+  終了      sed -i '1d' /tmp/test
[1] 28074
[2] 28076
[1]-  終了      sed -i '1d' /tmp/test
[2]+  終了      sed -i '1d' /tmp/test
[1] 28078
[2] 28080
[1]-  終了      sed -i '1d' /tmp/test
[3] 28082
[2]-  終了      sed -i '1d' /tmp/test
[4] 28084
[3]-  終了      sed -i '1d' /tmp/test
[4]+  終了      sed -i '1d' /tmp/test
$ cat /tmp/test
$ cat /tmp/result
1
1
2
4
4
5
7
7
9
9

■良い例
flockを利用する
/tmp/testから削除した行と、/tmp/resultに追記した値が一致している
$ touch /tmp/test.lock
$ for i in `seq 10`
> do
>   flock -x /tmp/test.lock -c "head -1 /tmp/test >> /tmp/result;sed -i '1d' /tmp/test" &
> done
[1] 28111
[1]+  終了      sed -i '1d' /tmp/test
[1] 28114
[1]+  終了      sed -i '1d' /tmp/test
[1] 28117
[1]+  終了      sed -i '1d' /tmp/test
[1] 28120
[1]+  終了      sed -i '1d' /tmp/test
[1] 28123
[1]+  終了      sed -i '1d' /tmp/test
[1] 28126
[1]+  終了      sed -i '1d' /tmp/test
[1] 28129
[1]+  終了      sed -i '1d' /tmp/test
[1] 28132
[1]+  終了      sed -i '1d' /tmp/test
[1] 28135
[1]+  終了      sed -i '1d' /tmp/test
[1] 28138
[1]+  終了      sed -i '1d' /tmp/test
$ cat /tmp/test
$ cat /tmp/result
1
2
3
4
5
6
7
8
9
10

2014-09-10

ログファイルに指定の文字列が指定回数出力されたらイベントを発生させる

/var/log/messagesにerrorという文字列が3回出力されたら"Detect!"という文字を出力させる場合だとこんな感じ

str="error";threshold=3;count=0;tail -n 0 -F /var/log/messages | while read i;do echo $i | grep -q $str && count=`expr $count + 1` && test $count -ge $threshold && echo 'Detect!' && break; done

→ちょっと改善 2015-03-20 ※簡略化&条件達成時に即プロンプトが戻るように
str="error";threshold=3;c=0;while read i;do [[ $i =~ $str ]] && ((c++)) && [[ $c -ge $threshold ]] && echo 'Detect!' && break; done< <(tail -n 0 -F /var/log/messages)
これを実行しつつ、別のところで
logger "test error"
logger "test error"
logger "test error"
と3回出力すると、"Detect!"と表示されましたヾ(*・∀・)ノ"

NFS上のファイルでtailfが効かない場合の対処法

NFS上のファイルに追記した際、別サーバ上でtailf(tail -f)しても更新が検知されず表示されませんでした(´・ω・`)
なんとかならないものかと試行錯誤してみたところ、とりあえずはこれで良さそうです。
tail -fs.1 filename

-sオプションで、0.1秒ごとにチェックしてね! って感じです。

-s, --sleep-interval=N with -f, sleep for approximately N seconds
(default 1.0) between iterations.
With inotify and --pid=P, check process P at
least once every N seconds.

2014-08-19

nkfやkkcコマンドを使わずにperlでファイルの文字コードを判定

Linuxでファイルの文字コード判定といえばnkfやkkcなどのコマンドを用いた方法が多数見受けられますが
入っていないこともあるわけで・・・
入れてしまえば良いのだけど、余計なものを入れたくないような場合に
恐らく標準的に入っているであろうperlを用いてファイルの文字コードを判定する方法です

/tmp/test.txtの文字コードを判定するのであれば
$ perl -nle 'use Encode::Guess; print Encode::Guess::guess_encoding($_,qw/shift-jis euc-jp 7bit-jis utf8/)->name;' /tmp/test.txt
utf8

2013-05-17

要パスワードのsudoをスクリプトから実行する

cgiなperlスクリプトの例だと
#! /usr/bin/perl
print "Content-type:text/html\n\n";
print `echo 'password for sudoers' | sudo -S date`;
な感じでおっけーヾ(*・ω・)シ

2013-04-04

linuxでディレクトリごとのサイズをhuman readableな単位でソートして表示する

例えば、配下のディレクトリの容量を含めず純粋にそのディレクトリに含まれているファイルの合計サイズが大きなディレクトリの上位5件を知りたい場合

普通にやってしまうと単位を考慮したソートがなされない
$ du -hS /* | sort -nr | head -5
1020K   /aaa
1020K   /bbb
1020K   /ccc
1016K   /ddd
1012K   /eee

-hオプションで単位をつけなかった場合と結果が違う
$ du -S /* | sort -nr | head -5
36643580  /vvv
4846020   /www
4198408   /xxx
3348584   /yyy
664132    /zzz
そこで、シェルスクリプトでごにょごにょしてみた
$ du -S /* | sort -nr | while read size fname; do for unit in k M G T P E Z Y; do if [ $size -lt 1024 ]; then echo -e "${size}${unit}\t${fname}"; break; fi; size=$((size/1024)); done; done | head -5
34G     /vvv
4G      /www
4G      /xxx
3G      /yyy
648M    /zzz
めでたし、めでたしヾ(*・ω・)シ

2013-01-07

sedで&(アンパサンド)に置換する

sedコマンドで&に置換しようとすると、&はヒットした文字列を意味してしまうので意図する通りに置換されてくれません
$ hoge="a&b"
$ echo "xyz" | sed "s/y/$hoge/"
xaybz
な感じ。 なので、bashに組み込まれている置換コマンドを併用してやるとうまくいきました
$ echo "xyz" | sed "s/y/${hoge/&/\&}/"
xa&bz
ほらねヾ(*・ω・)シ

2012-09-03

dateコマンドでISO 8601形式の出力をする

# date --iso-8601
2012-09-03
# date --iso-8601=hours
2012-09-03T11+0900
# date --iso-8601=minutes
2012-09-03T11:48+0900
# date --iso-8601=seconds
2012-09-03T11:50:39+0900
な感じでいけるようですよヾ(*・ω・)シ

2012-08-24

CentOSにGlusterFSをセットアップ

Amazon Web Servicesなどのクラウドサービスでも利用できる分散ファイルシステムなGlusterFSをAmazon EC2上のCentOSにセットアップしてみました
まずはソースコードをダウンロードしてきて展開してconfigure
wget http://download.gluster.org/pub/gluster/glusterfs/LATEST/glusterfs-3.3.0.tar.gz
tar zxvf glusterfs-3.3.0.tar.gz
cd glusterfs-3.3.0
./configure
・
・
・
configure: error: OpenSSL crypto library is required to build glusterfs
まぁ、怒られますね。。。
openssl-develを入れてリトライ
yum -y install openssl-devel
./configure
・
・
・
configure: error: python does not have ctypes support
yum install python-ctypes
./configure
・
・
・
GlusterFS configure summary
===========================
FUSE client        : yes
Infiniband verbs   : no
epoll IO multiplex : yes
argp-standalone    : no
fusermount         : no
readline           : no
georeplication     : yes
make
make install
これでインストールは完了
gluster --version
glusterfs 3.3.0 built on Aug 24 2012 08:44:05
Repository revision: git://git.gluster.com/glusterfs.git
Copyright (c) 2006-2011 Gluster Inc. <http://www.gluster.com>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.
今回は単純にサーバ側は1ノードで構成してみます
mkdir /gfs
service glusterd start
gluster volume create gv0 10.xxx.xxx.xxx:/gfs
gluster volume start gv0
※10.xxx.xxx.xxxはサーバ自身のInternal IPアドレス
情報を見てみます
gluster volume info

Volume Name: gv0
Type: Distribute
Volume ID: 2c09d301-1fda-4d91-8a50-15a8c71d0be8
Status: Started
Number of Bricks: 1
Transport-type: tcp
Bricks:
Brick1: 10.xxx.xxx.xxx:/gfs
これで、サーバ側は準備完了
続いてクライアント側
サーバ同様にGlusterFSをインストールして、fuseも入れます
yum -y install fuse
あとはマウントするだけ
mkdir /gfs
mount -t glusterfs 10.xxx.xxx.xxx:/gv0 /gfs
dfで状態を見てみるとちゃんとマウントできています
glusterfs#10.xxx.xxx.xxx:/gv0
                      10321152   3587840   6209024  37% /gfs

CentOSでnfsをセットアップ

まずはサーバ側にnfsをインストール
yum -y install nfs-utils
共有するディレクトリと共有先、権限を設定ファイルへ記入
/nfsというディレクトリを10.から始まるIPに対してread/write権限で許可
mkdir /nfs
chmod 777 /nfs
echo "/nfs 10.0.0.0/255.0.0.0(rw)" >> /etc/exports
そして、いざnfsサービスを起動してみると怒られちゃいました(´・ω・`)
service nfs start
NFS サービスを起動中:                                      [  OK  ]
NFS クォータを起動中: サービスを登録できません: RPC: 受け取れません; errno = 接続を拒否されました
rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).
                                                           [失敗]
NFS デーモンを起動中:                                      [失敗]
これはportmapサービスが起動していないと発生するそうなのでインストールして起動してみます
yum -y install portmap
service portmap start
そして、改めてnfsを起動
service nfs start
NFS サービスを起動中:                                      [  OK  ]
NFS クォータを起動中:                                      [  OK  ]
NFS デーモンを起動中:                                      [  OK  ]
NFS mountd を起動中:                                       [  OK  ]
OKですヾ(*・ω・)シ
続いて、クライアント側の設定
こちらも同様にportmapとnfsをインストールして起動してあげます。
yum -y install nfs-utils portmap
service portmap start
service nfs start
あとは、マウント先のディレクトリを作成してマウントしてあげるだけです
mkdir /nfs
mount -t nfs 10.xxx.xxx.xxx:/nfs /nfs
dfを見てみると
10.xxx.xxx.xxx:/nfs   10321280   3587712   6209280  37% /nfs
な感じでちゃんとマウントされてますね