[工具] Shell 批量比较服务器所有正在运行进程的变化

介绍

基本信息

作者:朱明宇
名称:批量比较服务器所有正在运行进程的变化
作用:批量比较服务器所有正在运行进程的变化

使用方法

1. 服务器清单 $server_list 每台服务器占用 1 行
2. 在此脚本的分割线内写入相应的内容,并和此脚本放在同一目录下
3. 给此脚本添加执行权限
4. 执行此脚本
5. 此脚本执行完成后,会将运行结果写入当前目录下的 $compare_file 里

脚本分割线里的变量

server_list=server_list.txt #服务器清单
first_time=first_time #存储第一次检结果的目录
second_time=second_time #存储第二次检查结果的目录
compare_file=comparison_results.txt #存储比较结果的文件

注意

此脚本执行前必须要先保证执行本脚本的用户能无密码 ssh 远程这些远程服务器

脚本

#!/bin/bash

####################### Separator ########################

server_list=server_list.txt
first_time=first_time
second_time=second_time
compare_file=comparison_results.txt

####################### Separator ########################

mkdir $first_time &> /dev/null
mkdir $second_time &> /dev/null
echo > $compare_file

read -p "Please input first second or compare now: " choice

check(){
        for server_name in `cat $1`
        do
                ssh -t $server_name "ps -A" | awk '{print $4}' > $2/$server_name
        done
}

compare(){
        for server_name in `cat $1`
        do
                echo $server_name >> $4
                for process in `cat $2/$server_name`
                        do
                        grep $process $3/$server_name &> /dev/null
                        if [ $? -ne 0 ];then
                                echo $process >> $4
                        fi
                done
                echo >> $4
        done
}

if [ $choice == first ];then
        check $server_list $first_time
fi

if [ $choice == second ];then
        check $server_list $second_time
fi

if [ $choice == compare ];then
        compare $server_list $first_time $second_time $compare_file
fi

[命令] Linux 命令 {} (设置字符串默认值、截取字符串、替换字符串里的内容)

内容一:设置字符串默认值

1.1 当要替换的变量未定义或为空时则给予其 1 个默认值

# value=
# newvalue=${value:-eternalcenter}
# echo $newvalue
eternalcenter
# value=mingyuzhu
# newvalue=${value:-eternalcenter}
# echo $newvalue
mingyuzhu

或者:

# value=
# newvalue=${value:=eternalcenter}
# echo $newvalue
eternalcenter
# value=mingyuzhu
# newvalue=${value:=eternalcenter}
# echo $newvalue
mingyuzhu

(补充:这里以当变量 value 存在且为空时则变量 newvalue 的值为 eternalcenter 为例)

1.2 当要替换的变量已定义且不为空时则给予其 1 个默认值

# value=
# newvalue=${value:+eternalcenter}
# echo $newvalue
# value=mingyuzhu
# newvalue=${value:+eternalcenter}
# echo $newvalue
eternalcenter

(补充:这里以当变量 value 存在且不为空时则变量 newvalue 的值为 eternalcenter 为例)

内容二:截取变量某一部分内容 (以字符在字符串的位置作为参照)

2.1 截取从第某个位置字符开始的所有内容

2.1.1 截取字符串中从左数第某个字符开始到左边的所有内容 (包含此字符本身)
# str=eternalcenter.com
# echo ${str::2}
et

或者:

# str=eternalcenter.com
# echo ${str:0:2}
et

或者:

# str=eternalcenter.com
# echo ${str:offset:2}
et

(补充:这里以截取字符串中从左数第 2 个字符和左边的所有内容为例)

2.1.2 截取字符串中从右数第某个字符开始到左边的所有内容 (不包含此字符本身)
# str=eternalcenter.com
echo ${str::0-2}
eternalcenter.c

(补充:这里以截取字符串中从右数第 2 个字符开始左边的所有内容为例)

2.1.3 截取字符串中从右数第某个字符开始到右边的所有内容 (包含此字符本身)
# str=eternalcenter.com
# echo ${str:0-2}
om

(补充: 截取字符串中从除右数第 2 个字符开始到右边的所有内容)

2.2 截取从第某个位置字符开始几个位置的字符的内容

2.2.1 截取字符串中从左数第某个字符开始几个字符的内容 (不包含此字符本身)
# str=eternalcenter.com
# echo ${str:5:4}
alce

(补充:这里以截取字符串中从左数第 5 个字符开始 4 个字符的内容为例)

(注意:在此情况下是从第 0 字符开始数第 1 个字符的,而不是从第 1 个字符开始数第 1 个字符)

2.2.2 截取字符串中从右数第某个字符开始几个字符的内容 (包含此字符本身)
# str=eternalcenter.com
# echo ${str:0-5:4}
r.co

(补充:这里以截取字符串中从右数第 5 个字符开始右边 4 个字符的内容为例)

(注意:在此情况下是从第 0 字符开始数第 1 个字符的,而不是从第 1 个字符开始数第 1 个字符)

2.3 截取从第某个位置字符到第某个位置字符的内容

2.3.1 截取字符串中从左数第某个字符到从右数第某个字符中的所有内容 (不包含这些字符本身)
# str=eternalcenter.com
# echo ${str:1:-4}
ternalcenter

(补充:这里以截取字符串中从左数第 1 个字符到右数第 4 个字符中的所有内容为例)

(注意:在此情况下是从第 0 字符开始数第 1 个字符的,而不是从第 1 个字符开始数第 1 个字符)

2.3.2 截取字符串中从右数第某个字符到从右数第某个字符中的所有内容 (不包含这些字符本身)
# str=eternalcenter.com
# echo ${str:0-5:0-1}
r.co

或者:

# str=eternalcenter.com
# echo ${str:0-5:-1}
r.co

(补充:这里以截取字符串中从右数第 1 个字符到从右数第 4 个字符中的所有内容为例)

(注意:在此情况下是从第 0 字符开始数第 1 个字符的,而不是从第 1 个字符开始数第 1 个字符)

2.4 截取字符串中除从左数第某个字符外的所有内容

# str=eternalcenter.com
# echo ${str:2}
ernalcenter.com

(补充:截取字符串中从除左数第 2 个字符开始到右边的所有内容)

内容三:截取变量某一部分内容 (以字符作为参照)

3.1 截取变量前一部分内容 (去尾)

3.1.1 截取变量右数第 1 个某个字符到左边的所有内容 (去尾) (不包含此字符本身)
# value=ming:yu:zhu
# newvalue=${value%:*}
# echo $newvalue
ming:yu

(补充:这里以截取变量 value 右数第 1 个冒号 “:” 左边的所有值并赋予给变量 newvalue 为例)

3.1.2 截取变量右数最后某个字符到左边的所有内容 (最大限度去尾) (不包含此字符本身)
# value=ming:yu:zhu
# newvalue=${value%%:*}
# echo $newvalue
ming

(补充:这里以截取变量 value 右数最后 1 个冒号 “:” 左边的所有并赋予给变量 newvalue 内容为例)

3.1.3 截取变量右数最后某几个字符到左边的所有内容 (使用变量) (去尾) (不包含此字符本身)
# value=mingyuzhu
# novalue=zhu
# newvalue=${value%%$novalue}
# echo $newvalue
mingyu

(补充:这里以截取变量 value 右数最后 1 个 zhu 左边的所有内容并赋予给变量 newvalue 为例)

3.2 截取变量后一部分内容 (掐头)

3.1 截取变量左数第 1 个某个字符到右边的所有内容 (掐头) (不包含此字符本身)
# value=ming:yu:zhu
# newvalue=${value#*:}
# echo $newvalue
yu:zhu

(补充:这里以截取变量 value 左数第 1 个冒号 “:” 右边的所有内容并赋予给变量 newvalue 为例)

3.2 截取变量左数最后某个字符到右边的所有内容 (最大限度掐头) (不包含此字符本身)
# value=ming:yu:zhu
# newvalue=${value##*:}
# echo $newvalue
zhu

(补充:这里以截取变量 value 左数最后 1 个冒号 “:” 右边的所有内容并赋予给变量 newvalue 为例)

3.3 去除变量左数最后某个字符到右边的所有内容 (使用变量) (掐头) (不包含此字符本身)
# value=mingyuzhu
# novalue=ming
# newvalue=${value##$novalue}
# echo $newvalue
yuzhu

(补充:这里以截取变量 value 左数最后 1 个 ming 右边的所有内容并赋予给变量 newvalue 为例)

内容四:当变量已定义且不为空时则将变量中的某部分替换成另一部分

# value=mingyuzhu
# noneedvalue=yu
# needvalue=zhu
# newvalue=${value/$noneedvalue/$needvalue}
# echo $newvalue
mingzhuzhu

(补充:这里以将变量 value 中的 yu 替换成 zhu 并赋予给变量 newvalue 为例)

[命令] Linux 命令 (()) (比较数值、比较字符串和数值运算)

内容一:(()) 比较符号

1.1 (()) 数值比较符号和运算符号

1) ==,若两个数值存在且相等,则结果为真
2) !=,若两个数值存在且不相等,则结果为真
3) >,若两个数值存在且前一个数值大于后一个数值,则结果为真
4) <,若两个数值存在且前一个数值小于后一个数值,则结果为真
5) >=,若两个数值存在且前一个数值大于或等于后一个数值,则结果为真
6) <=,若两个数值存在且前一个数值小于或等于后一个数值,则结果为真
7) + ,加法
8) – ,减法
9) * ,乘法
10) / ,除法
11) % ,求余

1.2 (()) 字符串比较符号

==,若两个字符串存在且一样,则结果为真

内容二:(()) 的数值比较案例

2.1 案例一:对整数进行比较

# (( 0 -ne 1 ))
# echo $?
0

(补充:这里以测试数字 0 是否不等于数字 1 为例)

2.2 案例二:对字符串进行比较

# (( a == a ))
# echo $?
0

(补充:这里以测试字符串 a 是否等于字符串 a 为例)

2.3 案例三:对整数进行运算

# a=1
# b=2
# c=$(($a + $b))
# echo $c
3