linux shell学习笔记 5
时间:2007-03-11 来源:wangbinde
[root@localhost ~]# cat kill_process.sh
#!/bin/bash
#获得当前进程号
current_PID=$$
#获得特定进程的进程号并重定向到一个临时文件
ps aux|grep "/usr/sbin/httpd"|grep -v "grep"|awk '{print $2}'>/tmp/${current_PID}.txt grep –v “grep”命令将过滤到grep命令本身产生的进程号
#命令块开始
#for pid in `cat /tmp/${current_PID}.txt`
#do
#{
#echo "kill -9 $pid"
#kill -9 $pid
#}
#done
#命令块结束
echo "/tmp/${current_PID}.txt文件将要被删除"
rm -f /tmp/${current_PID}.txt
信号就是系统向脚本或命令发出的告知某个时间发生的消息,用kill –l命令列出所有的信号。Kill命令发出信号给进程。
信号 |
信号名 |
含义 |
1 |
SIGHUP |
挂器或父亲进程被杀死 |
2 |
SIGINT |
来自键盘的中断信号,通常是ctrl-c |
3 |
SIGQUIT |
从键盘退出 |
4 |
SIGKILL |
无条件终止 |
5 |
SIGSEGV |
段(内存)冲突 |
6 |
SIGTERM |
条件终止(缺省杀进程) |
信号0为“退出shell”信号。为了发出信号0,只要从命令行键入exit,或在一个进程或命令行中使用<ctrl-d>。
trap对信号的捕捉:
可以使用trap命令在脚本中捕捉信号,命令的格式是trap name signal(s),name是捕捉到信号后所采取的动作,实际中name是专门用来处理所捕捉信号的函数,name必须用双引号括起来。Signal就是待捕捉的信号。常见的动作有:
1) 清除临时文件
2) 忽略该信号。(trap “”23)
3) 询问用户是否终止脚本的运行。
[root@localhost ~]# cat trap1.sh
#!/bin/bash
trap "exitprocess" 2
LOOP=0
function exitprocess()
{
echo "you just hit <ctrl-c>,at number $LOOP"
echo "I will now exit"
exit 1
}
while :
do
LOOP=$[$LOOP+1]
echo $LOOP
done
[root@localhost ~]# ./trap1.sh 此命令执行后,将在屏幕上输出递增的数字
在另一个终端中输入命令
root 2609 0.0 0.2 5192 1460 pts/1 Ss 22:20 0:00 -bash
root 2651 19.6 0.1 4484 996 pts/1 R+ 22:30 0:00 /bin/bash ./trap1
root 2652 0.0 0.1 3800 772 pts/0 R+ 22:30 0:00 ps aux
[root@localhost ~]# kill -2 2651
另一个终端脚本的运行将会终止
4766
4767
4768
4769
4770
you just hit <ctrl-c>,at number 4770
I will now exit
[root@localhost ~]# cat trap2.sh
#!/bin/bash
LOOP=0
trap 'exitprocess' 2
HOLD1=/tmp/hold1.$$
HOLD2=/tmp/hold2.$$
function exitprocess()
{
echo -e "/nRecived Interrupt ..."
echo -n "do you really wish to exit?(Y/N)"
read ANS
case $ANS in
Y|y)
rm_tmp_file
;;
N|n)
;;
*)
exitprocess
;;
esac
}
function rm_tmp_file()
{
echo "<ctrl-c> detecte .. Now cleaning up ... wait"
rm /tmp/*.$$ 2>/dev/null
exit 1
}
while :
do
LOOP=$[$LOOP+1]
echo $LOOP
df>>$HOLD1
ps xa>>$HOLD2
sleep 1
done
[root@localhost ~]# ./trap2.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root 2569 0.0 0.2 6016 1484 pts/0 Ss 21:48 0:00 -bash
root 2876 0.0 0.4 8852 2140 ? SNs 22:52 0:00 cupsd
root 2962 0.8 0.1 4876 1000 pts/0 S+ 23:11 0:00 /bin/bash ./trap2
root 3242 1.6 0.2 5860 1428 pts/1 Ss 23:13 0:00 -bash
root 3297 0.0 0.1 5752 544 pts/0 S+ 23:13 0:00 sleep 1
root 3298 0.0 0.1 3260 772 pts/1 R+ 23:13 0:00 ps aux
[root@localhost ~]# kill -2 2962
另一个终端里回弹出提示
eval命令:
Eval命令将首先扫描命令行进行所有的置换,然后再执行该命令,此命令适用于那些一次扫描无法实现无法实现其功能的变量。
logger命令向/var/log/message文件发送消息。命令格式为:
logger –p –i message
-p是优先级,此优先级只用于提示用户注意的优先级。
-i 在每个消息中记录发送信息的进程号。
[root@localhost ~]# mkdir -p /root/test/aa/bb 此脚本用于建立和源目录相同的目录结构
[root@localhost ~]# mkdir -p /root/test/cc/ss 创建源目录
[root@localhost ~]# ./cpdir.sh test test1
错误:目标目录test1不存在
[root@localhost ~]# mkdir test1
[root@localhost ~]# ./cpdir.sh test test1
源目录下test所有的子目录
-----------------------------
test/aa
test/aa/bb
test/cc
test/cc/ss
目标目录下test1所有的子目录
test1/aa
test1/aa/bb
test1/cc
test1/cc/ss
----------------------------
[root@localhost ~]# cat cpdir.sh
#!/bin/bash
#此脚本用于将源目录全部复制到目标目录中?确保目标目录中的子目录数空目录。
#脚本用法函数
usage()
{
echo "cpdir.sh 源目录 目标目录"
}
#判断是否为两个参数,否则提示语法
if [ $# -ne 2 ]
then
{
usage
exit 0
}
fi
srcdir=$1
desdir=$2
#判断源目录${srcdir}是否为空目录,否则提示错误信息和语法
if [ ! -d $srcdir ]
then
{
usage
echo "错误:源目录${srcdir}不是空目录"
exit
}
fi
#判断目标目录${desdir}是否为空,否则提示错误信息和语法.
if [ ! -d $desdir ]
then
{
echo "错误:目标目录${desdir}不存在"
exit
}
fi
processid=$$
#查找源目录下所有的子目录,输出并保存到/tmp/srcdir_tmp_进程号.txt的文件中
echo "源目录下${srcdir}所有的子目录"
echo "-----------------------------"
find $srcdir/* -type d|/usr/bin/tee /tmp/srcdir_tmp_${processid}.txt
sed "s/^${srcdir}/${desdir}/g" /tmp/srcdir_tmp_${processid}.txt >/tmp/srcdir_${processid}.txt
#在目标目录下建立空子目录
rm -fr ${desdir}/*
for subdir in `cat /tmp/srcdir_${processid}.txt`
do
{
mkdir ${subdir}
}
done
echo ""
echo "目标目录下${desdir}所有的子目录"
find $desdir/* -type d|/usr/bin/tee /tmp/desdir_${processid}.txt
#比较在目标目录下建立空目录后的差异
echo ""
echo "----------------------------"
diff /tmp/desdir_${processid}.txt /tmp/desdir_${processid}.txt
#rm -fr /tmp/srcdir_${processid}.txt
#rm -fr /tmp/desdir_${processid}.txt
#rm -fr /tmp/srcdir_tmp_${processid}.txt