首页 > 代码库 > 8、周期性任务、find、break和continue 学习笔记

8、周期性任务、find、break和continue 学习笔记

find [options] [查找路径] [查找条件] [处理动作]

查找路径:默认为当前目录

查找条件:默认为查找指定路径下的所有文件

处理动作:默认为显示


查找条件:

-name "文件名称" 支持使用globbing正则表达式

-iname "文件名称" 查找时不区分字符大小写


-user UserName 根据属主查找

-group GroupName 根据属组查找


-uid UID 根据uid查找

-gid GID 根据gid查找


-nouser 查找没有属主的文件

-nogroup 查找没有属组的文件


组合条件:

-a 与,同时满足

-o 或,满足其一

-not, ! 非,取反


-type: 根据文件类型查找

f: 普通文件

d: 目录

b: 块设备

c: 字符设备

l: 符号链接文件

p: 命名管道

s: 套接字


-size: 根据文件大小查找(常用单位:k, M, G)

-#M 查找所有文件大小小于#M的文件

+#M 查找所有文件大小大于#M的文件

#M 查找所有文件大小等于#M的文件


根据时间戳查找:

以天为单位(time):

-atime

-mtime

-ctime

+# 查找(#+1)天之外被访问过的文件

-# 查找#天之内被访问过的文件

  查找短于(#+1)> x >=#天的时间段被访问过


以分钟为单位(min):

-amin

-mmin

-cmin

+# 查找(#+1)分之外被访问过的文件

-# 查找#天之分被访问过的文件

  查找短于(#+1)> x >=#分的时间段被访问过


根据权限查找:

-perm [+|-]MODE

MODE         精确匹配

+MODE         任何一类用户的任何一位权限匹配;常用于查找某类用户的某特定权限是否存在;

-MODE          每类用户的指定要检查的权限位都匹配;


文件权限:644

-perm 600 否,因为不匹配644

-perm +222 是,因为任何一位有2权限

-perm +002      否,因为任何一位的权限都不匹配

-perm -444 是,因为每位的4权限都匹配



练习:

1、查找/var/目录属主为root且属组为mail的所有文件;

# find /var/ -user root -a -group mail


2、查找/usr目录下不属于root、bin或hadoop的所用文件;

# find /usr/ -not -user root -a -not -user bin -a -not -user hadoop

# find /usr/ -not \( -user root -o -user bin -o -user hadoop \)



3、查找/etc/目录下最近一周内其内容修改过的,且不属于root或hadoop的文件;

# find /etc/ -mtime -7 -a -not -user root -a -not -user hadoop

# find /etc/ -mtime -7 -a -not \( -user root -o -user hadoop \)



4、查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件;

# find / \( -nouser -o -nogroup \) -a -atime -30


5、查找/etc/目录下大于1M且类型为普通文件的所有文件;

# find /etc/ -size +1M -a -type f



6、查找/etc/目录所有用户都没有写权限的文件;

# find /etc/ -not -perm +222

所有都没有:相反:任何一个有

所有都有:相反:至少有一个没有


7、查找/etc/目录下至少有一类用户没有写权限;

# find /etc/ -not -perm -222


8、查找/etc/init.d/目录下,所有用户都有执行权限且其它用户有写权限的文件;

# find /etc/init.d/  -perm -113 



处理动作:

-print 默认打印在标准输出上

-ls 以长格式输出各文件信息

-exec COMMAND {} \; 对查找到的文件执行指定的命令

-ok COMMAND {} \; 交互式的-exec;

| xargs COMMAND




find补充材料(摘自互联网):



find与xargs

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现 溢出错误。

错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。


find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。


在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;


而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。



文件的特殊权限:


可执行文件:suid

任何用户执行此可执行文件时,不再以用户自己的身份当作进程的属主,而是以文件的属主当作进程的属主

suid表现为文件属主执行权限位上的s或S,有执行权限的为s而没有执行权限的为S

如何设定suid权限:

chmod u+s FILE


目录文件:sgid

具有sgid的目录,用户在此目录下创建文件时,新建文件的属组不再是用户所属的基本组,而是目录的属组


sgid表现为文件属组执行权限位上的s或S,有执行权限的为s而没有执行权限的为S


如何设定sgid权限:

chmod g+s FILE ...


粘滞位:sticky

对于公共可写的目录,用户可创建文件,可以删除自己的文件,但无法删除别的用户的文件


sticky表示为文件其它用户执行权限位上的t或T,,有执行权限的为t而没有执行权限的为T


如何设定sticky权限:

chmod o+t FILE ...



练习:

1、复制cat命令至/tmp目录,普通用户使用/tmp/cat命令能查看root用户有权限查看的所有文件

cp `which cat` /tmp/

cp /etc/shadow /tmp/

chmod u+s cat

 2、新建/tmp/test目录:

  要求openstack和docker用户对其有写权限,且在目录创建的文件的属组都为cloud组

  要求每个用户不能删除别人的文件,但可以编辑

  mkdir /tmp/test

  groupadd cloud

  useradd -G cloud openstack

  useradd -G cloud docker

  chmod g+w /tmp/test/

  chown :cloud /tmp/test

  chmod g+s test/

 

 


Linux任务计划:

一次性任务执行:at

周期性任务执行:crontab


一次性任务执行:

at: 

交互式:让用户在at>提示符输入多个要执行命令;

at TIME

at>

Ctrl+d:提交任务;

批处理:将任务的各命令写入文件由at进行调用;


at -f /path/to/at_job_file TIME



at作业有队列:使用单个字母表示

查看作业:at -l = atq


删除一个尚未执行的作业:

at -d job_num

atrm job_num


任务计划的执行结果会通过邮件的方式发送给任务提交者;


mail命令:

交互模式接收邮件;

交互模式发送邮件:

-s "Subject"

< /path/to/somefile



周期性任务计划:cron

crond: 守护进程

服务进程: 阻塞,轮询


系统cron:

文件:/etc/crontab

用户cron:

/var/spool/cron/UserName



/etc/crontab文件:每行定义一个独立的任务;


SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/


# 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


时间表示法:

1、每个时间位都应该使用其可用的有效取值范围内的值;

2、某时间位上的*表示对应位的所有有效取值;

3、-: 连续的时间相邻点取值;

4、,: 离散的时间点取值;

5、/#:表示在指定时间范围内每隔#一次;


注意:通过输出重定向而拒收邮件:

将执行结果重定向到/dev/null

&> /dev/null

将邮件发给空用户

MAILTO=""



用户cron:

使用crontab命令来实现

-l: 查看自己的cron任务列表;

-e: 通过EDITOR变量中定义的编辑器打开用户自己的cron配置文件;

编辑单独的任务都使用-e选项,无论是删除、修改还是新建;

-r: 移除crontab文件


如果是管理员:

-u UserName:为别的用户配置crontab作业;

# crontab -e -u docker


提醒:如果在crontab的用户命令中使用%,得转义为\%

5 3 * * * /bin/touch ~/testfile_`date +\%Y-\%m-\%d`.txt


在使用单引号后,%也可以不用转义

5 3 * * * /bin/touch ~/testfile_`date +‘%Y-%m-%d‘`.txt


练习:

1、每3分钟执行一个“echo "how are you?";

2、每周2、4、6备份/etc/目录至/backup目录中,备份的文件名以当etc_开头并跟上当日的日期作为文件名;

3、每天6、9、12、15、18查看一下当前系统挂载的所有文件系统,并将查看的结果追加至/tmp/mounts.txt文件中;

4、每天每两小时取当前系统内存空间余量,将其保存至/stats/memory.txt文件中;


crontab文件的格式:

空白行会被忽略

# 开头的行是注释;


1、*/3 * * * * /bin/echo "how are you?"

2、3 2 * * 2,4,6 /bin/tar -Jcf /backup/etc_`date ‘+%F‘`.tar.xz /etc/* 

3、17 6,9,12,15,18 * * * /bin/mount >> /tmp/mounts.txt

4、34 */2 * * * /bin/grep "^MemFree:" /proc/meminfo  >> /stats/memory.txt


如何实现秒级别的任务:

* * * * * for i in {0..4}; do /bin/echo "how are you?"; sleep 10; done 

 


facl: 文件访问控制列表

facl: 附加原有权限模型之上另一层权限控制机制,保存至文件扩展属性信息中;


getfacl FILE 获取文件的权限信息

setfacl {-x|-m} 权限 FILE 设置文件的权限

-m: 设定权限

-m u:UserName:Perms

-m g:GroupName:Perms

-m m::Perms

-x: 取消权限

-x u:UserName

-x g:GroupName

-x m:


-R: 递归


bash编程之循环控制:

for varName in LIST; do

循环体

done


while CONDITION; do

循环体

done


until CONDITION; do

循环体

done


循环控制:

continue: 提前结束本次循环而开始评估下一轮;

break [n]: 跳出当前循环




练习:提示用户输入用户名,显示用户的ID号;直到用户输入quit退出;

#!/bin/bash

#

if [ $UID -ne 0 ]; then

echo "`basename $0` must be running as root"

exit 1

fi


while true; do

read -p "Enter a user name: " userName

if [ "$userName" == ‘quit‘ ]; then

break

fi


id -u $userName

done



练习:写一个脚本

1、提示用户输入一个目录路径;

2、显示目录下至少包含一个大写字母的文件名;


#!/bin/bash

#

while true; do

        read -p "Enter a directory: " dirName

        [ "$dirName" == ‘quit‘ ] && exit 3

        [ -d "$dirName" ] && break || echo "Wrong directory..."

done



for fileName in $dirName/*; do

        if [[ "$fileName" =~ .*[[:upper:]]{1,}.* ]]; then

                echo "$fileName"

        fi

done


本文出自 “开源殿堂” 博客,请务必保留此出处http://kaiyuandiantang.blog.51cto.com/10699754/1943241

8、周期性任务、find、break和continue 学习笔记