shell脚本

1.思路:将程序放在后台执行,然后执行wait ,这样就可以等一个串行执行任务了

以备份Linux目录为例,rsync 放在后台执行,$! 表示最近的后台的PID ,wait 命令后接pid,等待pid程序执行完,才继续往下,否则主程序挂起

wait命令使当前shell进程挂起,等待所指定的由当前shell产生的子进程退出后,wait命令才返回

rsync命令用来复制或者文件备份,a 归档模式,A 保留原有ACL,X 保留原有属性 z 传输压缩 --delete 保持文件版本最新

#!/bin/bash

backupdir='/root /usr/local /var/log /var/named /boot /etc /var/spool'
destination='/home/backup/linux'

for dir in $backupdir;
do
        rsync -avAXz --log-file=/home/logs/backupLinux.log $dir $destination --exclude="lost+found" --delete &>/dev/null &
        wait $!
done

2.查找活跃用户

思路 利用登陆成功用户,rsyslogd会记载用户登陆信息到/var/log/wtmp 利用last命令可以读出,然后用awk 提取

last -f $log 读取特定log ,这样读取更早的log

last -f /var/log/wtmp.1

head -n -2 表示除了尾端两行,其余行都读取,这样剩下全是用户登陆信息了

提取过滤所有用户重定向到/tmp/users.$$ $$ 表示脚本的pid

小括号表示子程序程序块,里面的两层while 循环。

第一个while 循环 利用/tmp/users.$$ 作为输入,读取每行的user

扫描二维码关注公众号,回复: 110503 查看本文章
while read user;

读到user 后 找出 /tmp/log.$$ 含user 的行,然后统计次数,使用时间,最初登陆时间

统计次数

nlogins=`cat /tmp/user.$$ | wc -l`

最初登陆时间,直接读取最后一行

firstlog=`tail -n 1 /tmp/user.$$ | awk '{print $5,$6}'`

使用时间,这个while循环时间输入是我从网上找的答案,没看懂,求指教 “< <(cat /tmp/user.$$ | awk '{print $NF}' | tr -d ')(' | grep '[0-9]' | tr '+' ':')”

 while read t
                do
                         s=`echo $t | awk -F: '{if (NF==3){print($1*60*24+$2*60+$3)}else{print($1*60+$2)}}'`
                        let minutes=minutes+s
                done< <(cat /tmp/user.$$ | awk '{print $NF}' | tr -d ')(' | grep '[0-9]' | tr '+' ':')

由于超过24小时,last会显示1+格式,所有awk时要判断是否超过一天

awk: NR 代表行编号,$0 代表整行内容, NF 代表列编号 

 1 #!/bin/bash
 2 # 用途 查找活跃用户
 3 #
 4 
 5 log=/var/log/wtmp
 6 
 7 printf "%-4s %-10s %-10s %-6s %-8s\n" "Rank" "User" "Start" "Logins" "Usage_hours"
 8 
 9 last -f $log | head -n -2 > /tmp/ulog.$$
10 
11 cat /tmp/ulog.$$ | cut -d' ' -f1 | sort | uniq>/tmp/users.$$
12 
13 (
14         while read user;
15         do
16                 grep ^$user /tmp/ulog.$$ > /tmp/user.$$
17                 minutes=0
18 
19                 while read t
20                 do
21                         s=`echo $t | awk -F: '{if (NF==3){print($1*60*24+$2*60+$3)}else{print($1*60+$2)}}'`
22                         let minutes=minutes+s
23                 done< <(cat /tmp/user.$$ | awk '{print $NF}' | tr -d ')(' | grep '[0-9]' | tr '+' ':')
24 
25                 firstlog=`tail -n 1 /tmp/user.$$ | awk '{print $5,$6}'`
26                 nlogins=`cat /tmp/user.$$ | wc -l`
27                 hours=`echo "$minutes /60.0" | bc`
28                 printf "%-10s %-10s %-6s %-8s\n" $user "$firstlog" $nlogins $hours
29         done< /tmp/users.$$
30 ) | sort -nrk 4 | awk '{printf("%-4s %s\n",NR,$0)}'
31 
32 rm -f /tmp/users.$$ /tmp/user.$$ /tmp/ulog.$$

猜你喜欢

转载自www.cnblogs.com/kaifoon/p/8991522.html