Shell脚本实例2

根据进程包含的文本搜索并kill进程

APPPID=ps aux|grep "$1"|grep -v "grep"|grep -v "$0"|head -n 1|cut -c 9-15
if [ $APPPID ]; then
echo "Shutdown $1 process:$APPPID"
kill -9 $APPPID
else
echo "Process $1 NOT found."
fi

解释:

ps aux 表示查询进程列表

grep $1 表示匹配参数1

grep -v “grep” 表示排除包含grep的行

grep -v “$0” 表示排除当前执行脚本的行

head -n 1 表示只取第一行

cut -c 9-15表示截取第9-15个字符

root      1052  0.0  0.0 105996  4120 ?        Ss    2020   0:00 /usr/sbin/sshd -D
root     19695  0.0  0.0 148316  5496 ?        Ss   1月19   0:00 sshd: root@notty
root     25969  0.0  0.0 148316  5400 ?        Ss   12:09   0:00 sshd: root@pts/0
root     30172  0.0  0.0 112676   984 pts/0    R+   13:35   0:00 grep --color=auto ssh

Shell脚本实例

根据监听端口查找并kill进程

#!/bin/sh

if [ $# -ne 1 ]; then
    echo "port# parameter is required."
    exit
fi

APPPID=`netstat -anp|grep ":$1 "|grep LISTEN|head -n 1|awk '{print $7}'|cut -d/ -f1`
if [ $APPPID ]; then
  echo "Shutdown $1 process:$APPPID"
  #kill -9 $APPPID
else
  echo "Process $1 NOT found."
fi

解释:

-ne是数字比较运算符 表示不等于,类似的还有 -gt是大于的意思;-lt是小于;-eq是等于;-ne是不等于;-ge是大于等于;le是小于等于

$# 表示命令行参数的个数

if … then fi 是 IF判断的用法

netstat -anp 显示所有网络连接状态,包含对应的进程信息

grep “:$1” 表示匹配包含了参数1(监听端口)的行,前面有冒号,后面有空格,避免部分匹配,如仅匹配80,则 80,8000都会找到,而匹配”:80 “这样就进匹配了监听80端口的行

grep LISTEN 匹配包含LISTEN的行,即监听状态

head -n 1 表示只取第一行

awk ‘{print $7}’表示只取第七个域

cut -d/ -f1表示截取按/作为分割符后的第一个域,-d表示自定义非tab和空格作为分隔符, -c表示字符个数,-c和-f后可跟上数字表示具体取第几个,也可以 1,5-7这样的格式表示取第1,5,6,7个。

tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      1250/php-fpm: maste
tcp        0      0 127.0.0.1:18089         0.0.0.0:*               LISTEN      17773/sshd: root@no
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      1254/redis-server *
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2417/nginx: master
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      2417/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6189/sshd
tcp        0      0 127.0.0.1:8088          0.0.0.0:*               LISTEN      17773/sshd: root@no
tcp        0      0 127.0.0.1:19001         0.0.0.0:*               LISTEN      17773/sshd: root@no
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2106/master