Category Archives: shell

CentOSでDNSサーバーをインストールするスクリプト

スクリプトコード:
#!/bin/bash

conf=/var/named/chroot/etc/named.conf
datadir=/var/named/chroot/var/named
rpm -q bind &> /dev/null
if [ $? -ne 0 ]; then
yum -y install bind bind-chroot caching-nameserver
fi

if [ ! -f $conf ];then
echo “options {
directory \”/var/named\”;
};” > $conf
fi

read -p “ドメイン名を入力してください:” domain
grep $domain $conf &> /dev/null
if [ $? -ne 0 ]; then
echo “zone \”$domain\” in {
type master;
file \”$domain\”;
};” >> $conf
echo “\$ttl 86400
@ in soa ${domain}. root.${domain}. (
2013010101
3h
15m
1w
1d

)”> $datadir/$domain
while true
do
read -p “Type of recond(ns/a/cname/mx/ptr):” type
case $type in
ns)
echo $domain | grep “in-addr.arpa” &> /dev/null

if [ $? -eq 0 ]; then
read -p “hostname of FDQN:” fdqn
echo “@ in ns $fdqn.”>> $datadir/$domain

else
read -p “head of hostname:” head
echo “@ in ns $head”>> $datadir/$domain
fi
;;
a)
read -p “head of hostname:” head
read -p “ip address:” ip
echo “$head in a $ip”>> $datadir/$domain

;;
ptr)
read -p “ip address:” ip
read -p “hostname of FQDN:” fqdn
host=$(echo $ip | awk -F. ‘{print $4}’)
echo “$host in ptr $fqdn.”>> $datadir/$domain
;;
mx)
read -p “priority of recond:” priority
read -p “head of hostname:” head
read -p “ip address:” ip

echo “@ in mx $priority $head”>>$datadir/$domain
echo “$head in a $ip”>> $datadir/$domain
;;
cname)
read -p “please input aliase:” aliase
read -p “head of hostname:” head
echo “$aliase in cname $head”>> $datadir/$domain

;;
esac
read -p “続けてるか (yes/no)?” yn
if [ $yn = no ]; then
exit 0
fi

done
fi

「サーバー学習」shellの基本コマンド(uptime、find、crontab、catなど)

1.rootの最大のファイルを検索し、トップ10をリストする

[root@ip-172-31-5-226~]# find -type f -exec du -k {} \; | sort -nr | head -10
[root@ip-172-31-5-226~]# find -type f -exec du -k {} \; | sort -nr | tail -10
結果:
4492 ./.wp-cli/vendor/wp-cli/wp-cli/.git/objects/pack/pack-a619857a1dca5dc19a6d23b2f7a1e1c9d72e01c8.pack
1520 ./.wp-cli/vendor/rmccue/requests/.git/objects/pack/pack-2df70433818f2f9f0b039ab8798e1bb1c60ad463.pack
916 ./.wp-cli/composer.phar
588 ./.wp-cli/vendor/mustache/mustache/.git/objects/pack/pack-e99c2f26ef88dbb403bb37341b4f3a2eb59fb9d9.pack
528 ./.composer/cache/repo/https—packagist.org/p-provider-stale.json
512 ./.composer/cache/repo/https—packagist.org/p-provider-archived.json
496 ./.composer/cache/repo/https—packagist.org/p-provider-latest.json
480 ./.wp-cli/vendor/wp-cli/wp-cli/.git/objects/pack/pack-a619857a1dca5dc19a6d23b2f7a1e1c9d72e01c8.idx
404 ./.composer/cache/repo/https—packagist.org/p-provider-active.json
224 ./.wp-cli/vendor/rmccue/requests/library/Requests/Transport/cacert.pem
2.historyコマンドで出力回数10以内を出力
[root@ip-172-31-5-226~]# cat .bash_history | awk ‘{print $1}’ | sort | uniq -c | sort -nr | head -10
結果:
| sort -nr | head -10
268 ls
172 cd
72 vim
42 cat
30 df
29 mysql
25 uptime
25 cp
24 /etc/rc.d/init.d/nginx
23 chmod

3./etc/passwordの最後5行のユーザIDとユーザ名をリストする
[root@ip-172-31-5-226~]# tail -5 /etc/passwd | awk -F: ‘{print $3″ “$1}’
[root@ip-172-31-5-226~]# tail -5 /etc/passwd | awk -F: ‘{print “uid”$3″が”$1}’
結果:
497 memcached
496 mysql
97 dovecot
495 dovenull
500 lyg
4.システムのブート時間、過去1分、5分、15分以内平均負荷、結果をmydataに書き込む
[root@ip-172-31-5-226~]# uptime | awk ‘{print $1,$(NF-2),$(NF-1),$(NF) }’ | tr -d ‘,’ >>mydata
[root@ip-172-31-5-226~]# cat mydata
10:37:48 0.27 0.16 0.11

5.1分ごとにデータを収集する、「~/mydata」に書き込む
[root@ip-172-31-5-226]$ crontab -e
[root@ip-172-31-5-226]$ crontab -l
* * * * * uptime | awk ‘{print $1,$(NF-2),$(NF-1),$(NF) }’ | tr -d ‘,’ >>~/mydata
6.1分、5分、15分以内の平均負荷を収集したデータをグラフ化する
[root@ip-172-31-5-226~]# yum install gnuplot.x86_64 gnuplot-common.x86_64
[root@ip-172-31-5-226~]# gnuplot
gnuplot> set xdata time //x軸時間
gnuplot> set timefmt ‘%H%M%S’ //時間のフォーマット
gnuplot> set xlabel ‘TIME’ //x軸
gnuplot> set ylabel ‘AVERAGE’ //y軸
gnuplot> set xtics rotate
gnuplot> plot ‘~/mydata’ u 1:2 t ‘1-min’ with lines ,’~/mydata’ u 1:3 t ‘5-min’ with lines,’~/mydata’ u 1:4 t ’15-min’ with lines

 

7.gnuplotで描いたグラフを「*.png」拡張子を出力し、同時にデータを更新する
 7.1 スクリプトの内容
[root@ip-172-31-5-226~]# cat /opt/cpuload.gnuplot
#!/bin/bash
uptime | awk ‘{print $1,$(NF-2),$(NF-1),$(NF) }’ | tr -d ‘,’ >>/opt/mydata
gnuplot <<EOF
set terminal png tiny font ‘/usr/share/fonts/liberation/LiberationSans-Regular.ttf’
set output ‘/var/www/html/loadavg.png’
set xdata time
set timefmt ‘%H:%M:%S’
set xlabel ‘TIME’
set format x ‘%H:%M’
set xtics rotate
set ylabel ‘load average’
plot ‘/opt/mydata’ u 1:2 t ‘1-min’ with lines, ‘/opt/mydata’ u 1:3 t ‘5-min’ with lines,’/opt/mydata’ u 1:4 t ’15-min’ with lines
EOF
#注意:chmod +x /opt/cpuload.gnuplot

7.2 gnuplot.htmlのコード
[root@ip-172-31-5-226~]# cat /var/www/html/gnuplot.html
<html>
<h1>Performance Charts</h1>
<a href=”/loadavg_startnews24.png”>平均負荷</a>
</html>

7.3 crontab 内容
[root@ip-172-31-5-226~]# crontab -l
* * * * * uptime | awk ‘{print $1,$(NF-2),$(NF-1),$(NF) }’ | tr -d ‘,’ >>/opt/mydata
*/5 *

7.4 ページにアクセス
http://192.168.0.102/loadavg_startnews24.png

8.ルートディスク領域の使用量は50%より大きくかどうかチェックする
[root@ip-172-31-5-226~]# df | grep /$ | awk ‘{print $(NF-1)}’ | awk -F% ‘{if($1>50){print “50%使用量を超える”} else {print “50%使用量を超えない”}}’
50%使用量を超えない
9.すべてのプロセスのメモリ総量
root@ip-172-31-5-226~]# ps -eo rss | awk ‘BEGIN {print “すべてのプロセスのmemory総計:”} /^ *[0-9]/ { rss_total += $1} END {print rss_total }’
すべてのプロセスのmemory総量:
337448
10.ホストIPとサブネットマスクを確認する
[root@ip-172-31-5-226~]# ifconfig br0 | grep “inet addr” | awk -F: ‘{print $2,$NF}’ | awk ‘{print $1″/”$3}’
192.168.1.233/255.255.255.0
11.「8、9、10」の情報を取得するスクリプト
コード下記:
root@ip-172-31-5-226opt]# cat case.sh
#!/bin/bash
echo -e ”
\033[49;31;7m A \033[0m IP/submask
\033[49;32;7m B \033[0m Disk使用量
\033[49;33;7m C \033[0m memoryを使用したプロセの総量

read -p “項目を選択してください:” num

case $num in
a|A)
ifconfig br0 | grep “inet addr” | awk -F: ‘{print $2,$NF}’ | awk ‘{print $1″/”$3}’
;;
b|B)
df | grep /$ | awk ‘{print $(NF-1)}’ | awk -F% ‘{if($1>50){print “Disk使用量50%を超える”} else {print “Disk使用量50%を超えない”}}’
;;
c|C)
ps -eo rss | awk ‘BEGIN {print “すべてのプロセスのmemory総量:”} /^ *[0-9]/ { rss_total += $1} END {print rss_total }’
;;
*)
echo “[A|B|C]を入力してください”
esac

サーバ死活シェルスクリプトサンプル

shellコード:
#!/bin/bash
PREFIX=192.168.1
NODE=1
while [ “$NODE” -lt “255” ]; do
echo -en “Pinging ${PREFIX}.${NODE}…”
ping -c1 -w1 -t5 ${PREFIX}.${NODE} >/dev/null 2>&1
if [ “$?” -eq “0” ]; then
echo “OK”
else
echo “NG”
fi
let NODE=$NODE+1
done

「shellの学習」SVN(Subversion)リポジトリのバックアップ方法

スクリプトコード:

#!/bin/bash
SVN_REPOS=(/www/svn/web/*.arkgame.com)
BACKUP_BASE_DIR=/www/repo_backup
backup_rotate() {
if cd $1
then
for num in 7 6 5 4 3 2 1
do
old=`expr $num + 1`
if [ -d backup.${num} ]
then
if [ -d backup.${old} ]
then
rm -rf backup.${old} && mv backup.${num} backup.${old}
else
mv backup.${num} backup.${old}
fi
fi
done
else
echo “change BACKUP_DIR error!”
exit 1
fi
}
for REPO in “${SVN_REPOS[@]}”
do
REPONAME=`/usr/bin/basename $REPO`
BACKUP_DIR=”$BACKUP_BASE_DIR/$REPONAME”
[ -d “$BACKUP_DIR” ] || mkdir -p $BACKUP_DIR
cd $BACKUP_DIR && backup_rotate $BACKUP_DIR
/usr/bin/svnadmin hotcopy $REPO $BACKUP_DIR/backup.1
done

説明:

7個バックアップ、backup.1最新バックアップ、backup.7古いバックアップ

「shell入門」while文の使い方

1.基本形
while 条件文
do
命令1
命令2
命令3
done

 

2.サンプル
#!/bin/bash

i=1

while(($i<10))
do
echo $i
i=$(($i+1))
done

「shell入門」for文の使い方

1.基本形
for 変数 in アイテム1 アイテム2 … アイテムN
do
命令1
命令2
命令3
done

2.サンプル1
#!/bin/bash

for((i=1;i<20;i++))
do
echo $i
done

3.サンプル2
#!/bin/bash
for i in `seq 20`
do
echo $i
done

「shell入門」文字列を比較するサンプル

shellコード
#!/bin/bash

a=”123″
b=”1234″
c=”123″

if [ “$a”x != “$b”x ]
then
echo “a != b”
fi

if [ “$a”x = “$c”x ]
then
echo “a == c”
fi

空白文字列をチェックする
if [ -z “$d” ]
then
echo “d is empty”
fi

「shell入門」制御構文if文のサンプル

1.基本形
if 条件文1
then
命令1
elif 条件文2
命令2
elif 条件文3
命令3
else
命令4
fi

2.サンプル
#!/bin/bash

i=6
a=10

if [ $a -eq 10 ]
then
echo “a = 10”
fi

if [ $a -ne $i ]
then
echo “a != $i”
fi

if [ $a -gt $i ]
then
echo “a > i”
fi

if [ $a -lt $i ]
then
echo “a < i”
else
echo “a > i”
fi

if((“$a” > “$i”))
then
echo “(())a>i”
fi

if(($a != $i))
then
echo “(())a!=i”
fi

5 / 512345