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
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.$$