1. 程式人生 > >find命令使用及Linux任務調度

find命令使用及Linux任務調度

find命令使用及Linux任務調度

文件搜索和查找工具:
安裝文件名或文件的屬性來查找並定位文件的路徑;
locate:模糊查找工具;
基於專用的數據庫進行查找,但前提是數據庫必須事先存在,而且需要定期更新;
查找速度非常快,但是查找精度十分有限,且僅限於數據庫中包含的內容;
可以在特定的情況下,實施手動更新數據庫,需要使用updatedb命令即可;

        /var/lib/mlocate/mlocate.db:locate查找的數據庫文件;

    find:精確查找工具;
        查找精度非常高,但速度比較慢;
            在指定的位置通過文件名或其他文件的關鍵屬性對文件進行遍歷掃描; 
                註意:不建議對根目錄進行find操作;
        實時查找;

        限制:使用find命令僅能完成當前用戶有讀和執行權限的目錄的掃描查找;

find命令:
find - search for files in a directory hierarchy
find [path...] [expression]
path:查找路徑;
默認為當前工作目錄,也可以指定具體的查找目錄的路徑;
expression:
OPTIONS:
TESTS:查找條件;
實施本次查找的標準;既可以指定文件名,又可以指定諸如:文件大小,文件類型,文件權限和時間戳等;
ACTIONS:處理動作;
對於查找到的符合條件的文件進行某種指定的處理操作;默認值為將查找結果輸出到標準輸出;

        查找條件:
            根據文件名查找:
                -name pattern:文件名支持使用Globbing;(*,?,[],[^])
                [root@localhost ~]# find /etc/pass*
                /etc/passwd
                /etc/passwd-                    
                -iname pattern:忽略文件名中字母大小寫的區別,而進行查找;支持使用Globbing;
                -samefile name:根據指定的文件的文件名,查找其它硬鏈接文件的路徑;

            根據文件的inode號查找:
                -inum n:
                -links n:查找硬連接數為"n"的所有文件;
                -regex pattern:
                -iregex pattern:

            根據文件的所有權進行查找:
                -user uname
                -uid UID
                    就是根據用戶名和/或用戶ID,查找屬主為這個用戶賬戶的所有文件;
                -group gname
                -gid GID
                    就是根據組名和/或組ID,查找屬組為這個組賬戶的所有文件;
                -nogroup:在文件的所有權的權限位上,沒有屬組名稱僅顯示屬組ID的文件;
                -nouser:在文件的所有權的權限位上,沒有屬主名稱僅顯示屬主ID的文件;

            根據文件的類型:
                -type c:
                    c表示文件類型的單字符描述符,其中包括:
                        b:塊設備
                        c:字符設備
                        d:目錄
                        f:普通文件
                        l:符號鏈接
                        p:管道
                        s:套接字
                -xtype c:
                    符號鏈接文件的查找結果需要其他選擇的配合才能找到,否則查找的是被鏈接的原文件;

            根據時間戳進行查找:
                以天為時間單位進行查找:
                    -atime [+|-]n:根據訪問時間戳進行查找
                    -ctime [+|-]n:根據改變時間戳進行查找
                    -mtime [+|-]n:根據修改時間戳進行查找

                         n:[n,n+1)
                        +n:[n+1,+oo)
                        -n:[now,n)

                以分鐘為時間單位進行查找:
                    -amin [+|-]n:
                    -cmin [+|-]n:
                    -mmin [+|-]n:

            根據文件的大小進行查找:
                -size [+|-]n[cwbkMG]
                     n:(n-1,n]
                    +n:[n,+oo)
                    -n:[0,n-1]
             ~]# find /etc -size +2M
            邏輯運算操作符組合前面的條件進行復雜邏輯判斷:
                -a | -and:邏輯與運算,默認就是該邏輯運算,可省略;
                -o | -or:邏輯或運算;
                -not | !:邏輯非運算;

                德摩根定律依然生效;

            根據權限查找:
                -perm [/|-]mode
                     mode:精確權限匹配,意思是查找必須與指定的權限位完全匹配的文件;
                    /mode:任何一個權限位的權限中只要有一個權限能夠滿足條件,即為匹配成功,就可以將之作為查找結果;隱含了邏輯或關系;
                    -mode:每一個權限位的權限中都必須同時包含指定的權限位,才能滿足條件,才算匹配成功,將之作為查找結果;隱含了邏輯與關系;

                    真  取反  假
                    假  取反  真
                    全部為真  取反  任何一個為假
                    全部為假  取反  任何一個為真

        處理動作:
            -print:將符合條件的查找結果直接輸出到標準輸出;默認動作;
            -ls:將符合條件的查找結果以"ls -dils"命令的執行結果進行顯示,也就是在最後加-ls就會顯示出查找到的結果的詳細信息;
            -exec command {} \;
            -ok command {} \;
                對於符合條件的查找結果按照"command"命令再執行一遍,{}為占位符,其含義是:用來引用find命令查找結果中的各個文件的路徑信息;

                註意:
                    -exec是非交互式的;-ok是交互式的;
                    很多命令是不能放置與管道後面使用的;因為管道輸送的是純字符串信息,因此管道後面的命令一般來講都必須是處理字符串的命令;如果管道之後放置的命令不能處理純字符串,通常,可以使用xargs名將其轉換成能夠被管道後面的命令處理的參數;

                    示例:
                        # find -perm /222 | xargs chmod a+w

                        # chmod a+w $(find -perm /222)

                        # find -perm /222 { -exec|-ok } chmod a+w {} \;
                        查找當前系統上沒有屬主或屬組,且最近一個月內曾被訪問過的文件,並將其屬主屬組均修改為root;
                        find / ?nouser ?nogroup  -atime -1 -exec chown root:root {} \;

Linux任務調度:
在未來的某個時間點,讓系統自動觸發我們事先編寫好的命令的列表或腳本的執行,從而實現即使用戶不在計算機旁可以按時完成任務;

前提:
    1.時間的準確性;
    2.支持任務調度的應用程序;
        atd:在未來某個時間點執行一次計劃任務;
        crond:在未來某個時間點周期性的執行已設定計劃任務;

註意:在計劃任務中所有執行的操作命令的輸出結果,這類結果均以郵件的方式發送至指定用戶的郵箱中;

本地的電子郵件服務:
    SMTP:簡單郵件傳輸協議,TCP/25;

    mail [-s SUBJECT] USERNAME[@DOMAINNAME]

    /var/spool/mail目錄中為每個系統用戶都安放了郵箱;

atd任務調度進程,能夠識別和完成有at命令及batch命令定制的計劃任務;
    at命令:
        at [option] timespec

        timespec:
            1.HH:MM [YYYY-mm-dd]
            2.noon, midnight, teatime
            3.tomorrow
            4.now+#UNIT
                UNIT:minutes, hours, days, or weeks

        at定義的計劃任務都在某個特定的任務隊列之中;默認at只啟用了一個任務隊列,用字母"a"來標識;隊列名稱通常使用單個字母;

        at命令的常用用法:
            at [-q QUEUE_NAME] time:定義計劃任務;在輸入任務之後,Ctrl+d提交;

            atq或at -l
                查看所有的任務隊列中的尚未執行的計劃任務列表;

            atrm JOB_ID或at -d JOB_ID
                撤銷任務隊列中尚未執行的指定任務標識符的計劃任務;

            at -f /PATH/TO/SOME_FILE time

            at -c JOB_ID:查看指定的計劃任務的具體內容;

    batch命令:
        與at命令功能類似,都是一次性的定義計劃任務;

        區別是,batch命令定義計劃任務時,無需指定執行時間,而是由系統自動選擇較空閑時間完成此任務;

crond任務調度進程:能夠識別和周期性的執行crontab命令定制的計劃任務;
    需要cronie程序包提供;通常在CentOS系統中會被默認安裝;

    crontab定義的計劃任務分為兩類:
        系統任務:
            全局性任務;通常使用/etc/crontab文件中定義;
            /etc/crontab文件的通用格式:
                *    *      *  *  * user-name  command to be executed
              分鐘    小時   天 月 星期

             註意:
                * * * * *:定義周期性執行計劃任務的具體時間;
                user-name:運行後面命令的用戶賬戶;
                command to be executed:此次計劃任務的執行主體;為了保證任務能夠正確執行,命令建議使用絕對路徑;

        用戶任務:
            個體性任務;通常會存放在/var/spool/crom/下與用戶名對應的文件中;
            此類文件的格式:
                *    *      *    *   *     command to be executed
             分鐘 小時   天    月  星期

        時間表示法:
            1.某個特定時間:給定的時間點的有效取值範圍內的所有有效值;
                0 3 4 9 5
            2.通配符時間:"*",表示"每..."的意思;
            3.離散的時間點:
                0 8,20 * * 1,2,4,5
            4.連續的時間段:
                0-10 8-12 * * *
            5.步進時間:
                */3 * * * *

                */9 * * * *:無法真正實現每9分鐘執行一次;因此默認情況下,步進長度應該是能夠被60整除的數字;

            註意:最小的時間單位是分鐘,如果計劃使用不足一分鐘的若幹秒為執行周期,則必須借助於其他的機制,如:編寫shell腳本;

用戶周期性任務的定制:
    crontab命令:
        crontab - maintains crontab files for individual users

        crontab [-u user] file
        crontab [-u user] [-l | -r | -e] [-i]
            -u user:超級用戶為自己或其他用戶設置或編輯周期性任務時使用的選項;
            -l:查看所有的已經被定義好的計劃任務列表;
            -e:使用vi編輯器編輯臨時的crontab文件;
            -r:移除所有的計劃任務;建議謹慎使用;
            -i:在使用-r選項時,能夠進行交互式刪除;

find命令使用及Linux任務調度