您的位置:首页 > 运维架构 > Shell

详解shell脚本(十一)—— 提高与补充

2018-02-23 23:32 246 查看
用cron进行调度

cron利用的是一个叫做cron表的文件,这个文件中存储了需要执行的脚本或命令的调度列表以及执行时间。一个常见的用法是设置在免费时段(一些ISP提供免费使用时间,通常是在午夜),从Internet上进行下载。用户完全不需要在夜里熬红双眼等待下载。只需要编写一个cron条目,然后调度下载即可。你也可以安排当免费时段结束后自动断开Internet连接并关机。

#每天每小时第二分钟执行脚本
02 * * * * /home/slynux/test.sh
#每天第5,6,7小时执行脚本
00 5,6,7 * * /home/slynux/test.sh
#在每周日的每个小时执行脚本
00 */12 * * 0 /home/slynux/script.sh
#在每天凌晨2点关闭计算机
00 02 * * * * /sbin/shutdown -h
#调度cron作业
crontab -e
#输入crontab -e 后,会打开默认的文本编辑器供用户输入cron作业并保存。该cron作业将会在指定的时间被调度执行
#创建一个文本文件,并写入cron作业,将文件名最为参数命令,运行crontab
crontab task.cron
#在行内(inline)指定cron作业,而无需创建单独的文件。例如:
crontab<<EOF
02 * * * * /home/slynux/script.sh
EOF


cron表中的每一个条目都由6部分组成,并按照下列顺序排列:

分钟(0-59)

小时(0-23)

天(1-31)

月份(1-12)

工作日(0-6)

命令

如果你希望在某个特定时段执行命令,那么就在对应的时间字段中指定时段,并用逗号分隔(例如要在5分钟和10分钟时运行命令,那就在分钟字段中输入”5,10”)。在分钟字段使用*/5,可以每5分钟运行一次命令。这个技巧可以用在任何时间字段。

要在启动时运行命令,请将下面一行加入crontab:

@reboot command

用logrotate管理日志文件

logrotate的配置目录位于/etc/logrotate.d。如果列出这个目录中的内容,你会发现很多其他的日志文件配置。

#我们可以为自己的日志文件(such as /var/log/program.log)编写一个特定的配置:
cat /etc/logrotate.d/program
/var/log/program.log {
missingok
notifempty
size 30k
compress
weekly
rotate 5
create 0600 root root
}

参数                              描述
missingok            如果日志文件丢失,则忽略;然后返回(不对日志文件进行轮替)
notifempty                  仅当源日志文件非空时才对其进行轮替
size 30k               限制实施轮替的日志文件的大小。可以用1M表示1MB
compress                     允许用gzip压缩较旧的日志
weekly            指定进行轮替的时间间隔。可以是weekly,yearly或daily
rotate 5        这是需要保留的旧日志文件的归档数量。在这里指定的是5,所以这些文件名将会是program.log1gz、program.log2.gz等知道program.log5.gz


create 0600 root root 指定所要创建的归档文件的模式,用户以及用户组

以逆序形式打印行

seq 9 | \
awk '{ lifo[NR]=$0 }
END{ for(lno=NR;lno>-1;lno--){ print lifo[lno]; }
}'


这个awk脚本非常简单。我们将每一行都存入一个关联数组中,用行号作为数组索引(行号由NR给出),最后由awk执行END语句块。为了得到最后一行的行号,在{ }语句块中使用lno=NR。因此,这个脚本从最后一行一直迭代到第0行,将存储在数组中的各行以逆序方式打印出来。

解析文本中的电子邮件地址和URL

egrep -o '[A-Za-z0-9._]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}' 1.txt
#email

egrep -o "http://[a-zA-Z0-9.]+\.[a-zA-Z]{2,3}" 1.txt
#URL


在文件中移除包含某个单词的句子

sed 's/ [^.]*mobile phones[^.]\.//g' 1.txt


列出网络上所有的活动主机

#!/bin/bash
#desc:根据网络配置对网络地址192.168.0进行修改

for ip in 192.168.0.{1..255};
do
ping $ip -c 2 &> /dev/null;
if [ $? -eq 0 ];
then
echo $ip is alive
fi
done


计算一个小时内CPU的占用情况

#!/bin/bash
SECS=3600
UNIT_TIME=60
#将SECS更改成需要进行监视的总秒数
#UNIT_TIME是取样的时间间隔,单位是秒
STEPS=$(( $SECS / $UNIT_TIME ))
echo Watching CPU usage...
for((i=0;i<STEPS;i++))
do
ps -eocomm,pcpu | tail -n +2 >> /tmp/cpu_usage.$$
sleep $UNIT_TIME
done
echo
echo CPU eaters :

cat /tmp/cpu_usage.$$ | \
awk '
{ process[$1]+=$2; }
END{
for(i in process)
{
printf("%-20s %s\n",i,process[i]);
}

}' | sort -nrk 2 | head

rm /tmp/cpu_usage.$$


在上面的脚本中,主要的输入源是ps -eo comm,pcpu,其中comm表示命令名(command name),pcpu表示CPU使用率(CUP usage in percent)。该命令输出所有进程名及CPU使用率。每个进程对应一行输出。因为需要监视一小时内CPU的使用情况,所以我们得在一个每次迭代时间为60秒的for循环中不停地用ps -eo comm,pcpu | tail -n +2来获取CPU的使用统计数据,并将这些数据添加到文件 /tmp/cpu_usage.$$ 中。60秒的迭代时间通过sleep 60来提供。这就使得每分钟执行一次ps。tail -n +2用来将 ps 输出中的头部和 COMMAND %CPU剥除。

cpu_usage. 中的 表示当前脚本的进程 ID。假设进程 ID为1345,那么在脚本执行时它会被替换成 /tmp/cpu_usage.1345。因为这是一个临时文件,所以我们把它放在 /tmp中。统计文件在1小时后就准备妥当了,文件中包含了60项,分别对应每分钟的进程状态。然后用awk求出每个进程总的CPU使用情况。我们用了一个关联数组来统计CPU使用情况。其中进程名作为数组索引。最后根据总的CPU使用情况依数值逆序排序,并通过head获得前10项。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: