SHELL脚本实例 进程和计划任务
1、 SHELL脚本实例
1.1 编写脚本实现登录远程主机(使用expect和shell两种形式)
# expect方式
#yum -y install expect
[root@CentOS8 scripts]#cat remote_ssh_expect.sh
#!/usr/bin/expect
set ip [lindex $argv 0] #expect 定义变量要使用set,$argv 0把第一个参数传递给Ip
set user [lindex $argv 1]
set passwd [lindex $argv 2]
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$passwd\r" }
}
interact #登录后不退出
# shell方式
[root@CentOS8 scripts]#cat remote_ssh_shell.sh
#!/bin/bash
IP=$1
USER=$2
PASSWD=$3
sshpass -p $PASSWD ssh -o StrictHostKeyChecking=no $USER@$IP
1.2 生成10个随机数保存于数组中,并找出其最大值和最小值
[root@CentOS8 scripts]#cat max_min.sh
#!/bin/bash
declare -i min max
declare -a nums
for ((i=0;i<10;i++));do
nums[$i]=$RANDOM
[ $i -eq 0 ] && min=${nums[$i]} && max=${nums[$i]} && continue
[ ${nums[$i]} -gt $max ] && max=${nums[$i]}
[ ${nums[$i]} -lt $min ] && min=${nums[$i]}
done
echo "Numbers are ${nums[*]}"
echo Max is $max
echo Min is $min
[root@CentOS8 scripts]#bash max_min.sh
Numbers are 6078 29355 24288 155 18357 18446 18193 24862 4175 28214
Max is 29355
Min is 155
1.3 输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
[root@CentOS8 scripts]#cat argssum.sh
#!/bin/bash
read -p "请输入数值个数:" COUNT
declare -a nums
for ((i=0;i<$COUNT;i++));do
num[$i]=$RANDOM
done
echo "${num[@]}"
declare -i n=$COUNT
for (( i=0; i<n-1;i++ ));do
for (( j=0;j<n-1-i;j++ ));do
let x=$j+1
if (( ${num[$j]} < ${num[$x]} ));then
#从大到小排序
tmp=${num[$x]}
num[$x]=${num[$j]}
num[$j]=$tmp
fi
done
done
echo ${num[*]}
echo "the max integer is $num,the min integer is ${num[$((n-1))]}"
[root@CentOS8 scripts]#bash argssum.sh
请输入数值个数:5
4294 14760 32042 26561 20442
32042 26561 20442 14760 4294
the max integer is 32042,the min integer is 4294
1.4 编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"Success!",若ping不通则输出"Fail!"
# for方式
[root@CentOS8 scripts]#cat for_ping.sh
#!/bin/bash
IP=10.0.0.
for i in {1..254};do
{
ping -c1 -W1 $IP$i &> /dev/null && echo "$IP$i is Success!" || echo "Fail!"
}& # &后台执行
done
wait
[root@CentOS8 scripts]#bash for_ping.sh
10.0.0.2 is Success!
10.0.0.8 is Success!
Fail!
Fail!
# while方式
[root@CentOS8 scripts]#cat while_ping.sh
#!/bin/bash
IP=10.0.0.
declare -i NUM=1
while [ $NUM -lt 255 ];do
{
ping -c1 -W1 $IP$NUM &> /dev/null
if [ $? -eq 0 ];then
echo "$IP$NUM is Success!"
else
echo "$IP$NUM is Fail!"
fi
}&
let NUM+=1
done
wait
2、进程管理和性能相关工具
2.1 进程树 pstree
pstree 可以用来显示进程的父子关系,已树形结构显示
格式:
pstree [OPTION] [ PID | USER ]
常用选项
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高度指定进程及其前辈进程
2.2 进程信息 ps
常用选项:
a 包括所有终端的进程
x 包括不连接终端的进程
u 显示进程所有者信息
-e 显示所有进程,相对于-A
-f 显示完整格式程序信息
k|--sort 对属性排序,属性前加 - 表示倒序
#常用组合
aux
-ef
2.3 负载查询 uptime
uptime和w 显示以下内容
- 当前时间
- 系统已启动的时间
- 当前上线人数
- 系统平均负载 (1,5 ,15分钟的平均负载)
2.4 查看进程实时状态 top
排序:
- P: 以占据的CPU百分比 %CPU
- M: 占据内存百分比 %MEM
- T: 累积占据CPU时长 TIME+
2.5 显示统计占用系统内存最多的进程,并排序
top 方式
ps方式
[root@CentOS8 scripts]#ps aux|sort -k4nr | head -5
root 843 0.0 2.7 224856 40320 ? S 21:16 0:00 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files
root 819 0.0 2.1 426372 31292 ? Ssl 21:16 0:01 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
rpcuser 907 0.0 1.9 71724 28260 ? Ss 21:16 0:00 /usr/sbin/rpc.statd
polkitd 798 0.0 1.6 1763340 24444 ? Ssl 21:16 0:00 /usr/lib/polkit-1/polkitd --no-debug
root 801 0.0 1.2 391392 18284 ? Ssl 21:16 0:00 /usr/sbin/NetworkManager --no-daemon
3、任务计划
3.1 周期性任务计划 cron
cron依赖于crond服务,确保crond守护处于运行状态
#Centos 7 以后版本:
systemctl status crond
#Centos 6:
service crond status
cron任务分为
- 系统cron任务: 系统维护作业,/etc/crontab主配置文件,/etc/cron.d/子配置文件
- 用户cron任务: 保存在/var/spool/cron/USERNAME,使用crontab命令管理
计划任务日志: /var/log/cron
3.1.1 系统cron计划任务
[root@CentOS8 scripts]#cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
3.1.2 用户计划任务
crontab命令:
- 每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
- 默认标准输出和错误会被发邮件给对应的用户,如:wang创建的任务就发送至wang的邮箱
- root能够修改其它用户的作业
- 用户的cron中默认PATH=/usr/bin:/bin,如果使用其它路径,在任务文件的第一行加PATH=/path
crontab命令格式:
crontab [-u user] [-l | -r | -e] [-i]
常用选项:
-l 列出所有任务
-e 编辑任务
-r 移除所有任务
-i 同-r一同使用,以交互式模式移除指定任务
-u user 仅root可运行,指定用户管理cron任务
3.1.3 实例: 每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
[root@CentOS8 scripts]#cat cron_bak.sh
#!/bin/bash
[ -d /backup ] || mkdir /backup
tar -JPcf /backup/etcbak-`date -d '-1 day' +%F-%H`.tar.xz /etc
[root@CentOS8 scripts]#crontab -e
30 1 * * 0-4 /bin/bash /data/scripts/cron_bak.sh &> /dev/null
[root@CentOS8 scripts]#crontab -l
30 1 * * 0-4 /bin/bash /data/scripts/cron_bak.sh &> /dev/null
3.1.4 实例: 工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于10%,就发送邮件报警
[root@CentOS8 scripts]#cat check_disk.sh
#!/bin/bash
WARING=80
[root@CentOS8 scripts]#cat check_disk.sh
#!/bin/bash
WARING=10
USE=`df -h | awk -F " +|%" '/^\/dev\/sda/{print $5}' |sort -nr | head -n1`
[ "$USE" -gt $WARING ] && wall disk will be full
[root@CentOS8 scripts]#crontab -l
*/10 * * * 0-4 /bin/bash /data/scripts/check_disk.sh &> /dev/null