Feb 7, 2013

[memo] Kill all process by uid in Linux

Sometimes flunetd porecess is not stopped by "/etc/init.d/td-agent stop".
So I executed the following command.
killall -9 -u td-agent
view raw gistfile1.sh hosted with ❤ by GitHub

Feb 5, 2013

bash while loopの変数が初期化される問題

業務上処理件数を調べる必要があったため軽くスクリプトを書くつもりが変数が初期化される現象に遭遇してはまった。

最初書いたスクリプトはこちらです。
#!/bin/sh
LIST=ls /usr/local/tomcat/logs/logs.log.2013-*-*.gz > ./targetlist.txt
count=0
sed -e "s/#.*//" -e "s/^\s*$//" $LIST | while read line; do
temp=`zgrep -c -E -i -w 'target1|target2' $line`
count=$(($count + $temp))
echo "$count"
done
echo "$count"
view raw oddbash.sh hosted with ❤ by GitHub

特に問題ないように見えますが、最後のecho文の結果が0(zero)になります。

Google先生に聞くと下記のサイトを教えて下れました。
http://www.edwardawebb.com/linux/scope-issue-bash-loops

それで修正したスクリプトがこちら。正しくカウントできました。
#!/bin/sh
ls /usr/local/tomcat/logs/logs.log.2013-*-*.gz > ./targetlist.txt
exec 0<./targetlist.txt
count=0
while read line; do
temp=`zgrep -c -E -i -w 'target1|target2' $line`
count=$(($count + $temp))
echo "$count"
done
echo "$count"
view raw safebash.sh hosted with ❤ by GitHub


ではなぜこの現象が起きるかというとパイプ(|)からのstdinはいつもsubshellを使うそうです。なのでループの中のcountはループ内の変数になってしまいます。
while文前パイプを使った場合よく起きるそうです。w

上で修正したスクリプトは自分のスタイルではないので下記のように見やすく修正しました。
#!/bin/sh
RESULT=`ls /usr/local/tomcat/logs/logs.log.2013-*-*.gz`
count=0
while read line; do
temp=`zgrep -c -E -i -w 'target1|target2' $line`
count=$(($count + $temp))
echo "$count"
done <<< "$RESULT"
echo "$count"
view raw finalscript.sh hosted with ❤ by GitHub