天天看點

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

until CONDITION; do

循環控制:

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

id -u $userName

練習:寫一個腳本

1、提示使用者輸入一個目錄路徑;

2、顯示目錄下至少包含一個大寫字母的檔案名;

        read -p "Enter a directory: " dirName

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

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

for fileName in $dirName/*; do

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

                echo "$fileName"

        fi

      本文轉自開源殿堂 51CTO部落格,原文連結http://blog.51cto.com/kaiyuandiantang/1943241:,如需轉載請自行聯系原作者