6. 使用read来定义变量

为了演示下边的例子,首先我们先安装Apache 服务器,然后启动Apache.

[root@localhost ~]# yum install httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# ps aux | grep http
root      3716  0.5  0.0 221936  5000 ?        Ss   13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3717  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3718  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3719  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3720  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3722  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
root      3728  0.0  0.0 112648   960 pts/0    R+   13:49   0:00 grep --color=auto http
[root@localhost ~]# 

这时候我们看到Apache服务一共启动了3716,3717,3718,3719,3720,3722这几个pid的process.最后一行3728比较特殊,这个process是ps aux的进程pid.
在下边的例子中,我们要把这个进程过滤掉。

进入主题,我们创建一个名为tokill的shell,这个脚本的目的是根据用户输入的关键字,来kill掉与之相关的所有进程(process)

 #!/bin/bash
 #
 #Ask what to stop using the kill command and then kill it

echo Which process do you want to kill?
read TOKILL

kill $(ps aux | grep $TOKILL | grep -v grep | awk '{ print $2 }')

当shell 进入到 read TOKILL这条命令时,会停下来一直等待用户的输入,并且把用户的输入赋值给TOKILL这个变量。

kill (psaux|grep TOKILL | grep -v grep | awk ‘{ print $2 }’)这一行稍微复杂一点,我们一一解释

ps aux | grep http,是要列出来所有包含http关键字的进程列表

[root@localhost ~]# ps aux | grep http
root      3716  0.5  0.0 221936  5000 ?        Ss   13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3717  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3718  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3719  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3720  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3722  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
root      3728  0.0  0.0 112648   960 pts/0    R+   13:49   0:00 grep --color=auto http
[root@localhost ~]# 

之前说过了,最后一行不是我们想要的。我们要把这一行过滤掉。

 [root@localhost ~]# ps aux | grep http | grep -v grep
root      3716  0.0  0.0 221936  5000 ?        Ss   13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3717  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3718  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3719  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3720  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND
apache    3722  0.0  0.0 224020  3088 ?        S    13:49   0:00 /usr/sbin/httpd -DFOREGROUND

然后我们要得到所有的进程号(PID)

[root@localhost ~]# ps aux | grep http | grep -v grep | awk '{ print $2 }'
3716
3717
3718
3719
3720
3722
[root@localhost ~]# 

awk是一个工具,用来处理格式化的数据,例如我们想拿到列表中的第二列
awk更详细的使用方法请参照http://www.cnblogs.com/wangqiguo/p/5863266.html

最后执行 (),(commandsubstitution) ( 命令 )中的命令
,并且把执行后的结果提供给kill来使用,也就是把所有的pid都给kill来使用。

下面来执行脚本,别忘了付给用户执行的权限。

[root@localhost ~]# cd /usr/local/bin/
[root@localhost bin]# ll
total 4
lrwxrwxrwx. 1 root root  30 May 12 13:51 db2greg -> /opt/ibm/db2/V11.1/bin/db2greg
lrwxrwxrwx. 1 root root  32 May 12 13:51 db2ls -> /opt/ibm/db2/V11.1/install/db2ls
-rw-r--r--. 1 root root 192 Jun 17 13:39 tokill.sh
[root@localhost bin]# chmod +x tokill.sh 
[root@localhost bin]# ./tokill.sh 
Which process do you want to kill?
http
[root@localhost bin]# ps aux | grep http
root      4102  0.0  0.0 112648   956 pts/0    S+   14:12   0:00 grep --color=auto http
[root@localhost bin]# 

我们可以看到http的process都 被kill掉了。
但是这还没有完,如果我们在执行一次tokill.sh

[root@localhost bin]# ./tokill.sh 
Which process do you want to kill?
http
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
[root@localhost bin]# 

我们会发现刚才执行好好的脚本又出错了。

[root@localhost bin]# bash -x tokill.sh 
+ echo Which process do you want to 'kill?'
Which process do you want to kill?
+ read TOKILL
http
++ ps aux
++ grep http
++ grep -v grep
++ awk '{ print $2 }'
+ kill
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
[root@localhost bin]# 

我们使用bash -x 来调试代码
发现执行到kill的时候出错了,这是为什么呢?
我们在命令行里单独执行

[root@localhost bin]# ps aux | grep http |grep -v grep | awk '{print $2}'
[root@localhost bin]# 

发现http的process已经都不存在了,因为kill 命令需要一个pid 作为必填的参数,所以当pid为空的时候就报错了,如何解决这个问题。且听下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值