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 方式

top M排序

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