Linux學習之路-Linux-at及cron命令【7】---20171215

ntpdate 命令

[root@Centos6~]#ntpdate 172.18.0.1                     -------->ntpdate 命令跟服務器同步時間
18 Dec 21:16:25 ntpdate[7932]: step time server 172.18.0.1 offset 412750.511124 sec
[root@Centos6~]#date
2017年 12月 18日 星期一 21:16:35 CST
[root@Centos6~]#ll /usr/bin/at
-rwsr-xr-x. 1 root root 54464 3月  22 2017 /usr/bin/at                 -------->具有SUID權限

cron 命令

  • 週期性任務計劃:cron

    相關的程序包:

  • cronie: 主程序包,提供crond守護進程及相關輔助工具

    Cronie包含在預定時間運行指定程序的標準UNIX守護進程crond和相關工具。 它是原來的vixie-cron的一個分支,並具有像使用pam和SELinux一樣的安全和配置增強功能

  • cronie-anacron:cronie的補充程序,用於監控cronie任務執行狀況,如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨後啓動一次此任務

    anacron是cronie的一部分,用於定期運行的工作,沒有確切的執行時間。anacron的默認設置執行每日,每週和每月的工作,但是anacron允許設置任意的工作週期。使用anacron可以運行週期性作業,即使系統經常關閉,也可以隨機執行作業執行時間,以更好地利用多個系統之間共享的資源

  • crontabs:包含CentOS提供系統維護任務

    fedora主要使用這個包來通過cron來執行文件。crontabs軟件包包含root crontab文件和目錄。將需要安裝cron守護進程以從crontabs運行作業。cron守護程序(如cronie或fcron)會檢查crontab文件以查看特定命令何時執行。 如果命令被安排,它執行它們。Crontabs處理一個基本的系統功能,所以它應該安裝在系統上

    [root@Centos6~]#cat /etc/crontab                                              ----------->查看系統計劃任務文件內容格式
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin                                               ---------->PATH變量路徑,所以建議可執行程序建議寫全完整路徑
    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
    11 10 * * * L wall hello
    [root@Centos6~]#cat /var/log/cron                                      ----------->查看日誌文件
    ........
    Dec 19 10:11:01 Centos6 crond[2056]: (*system*) RELOAD (/etc/crontab)
    Dec 19 10:11:01 Centos6 CROND[8922]: (L) CMD (wall hello)
  • 注意:命令執行的日期可以由兩個字段指定 - 日期和星期幾。如果兩個字段都受限制(即不是 * ),則當任一字段與當前時間匹配時,將運行該命令。
    例如,“30 4 1,15 * 5”將會在每個月的1號和15號以及每個星期五的凌晨4點30分執行命令。
    如果就想既是1,15號並且是星期5,就需要在計劃任務後加腳本,在腳本內判斷是否是星期5,如果是星期五在執行腳本,這樣就能達到既是1,15號並且是星期5的需求
    [root@Centos6~]#day=`date +%w`;[ "$day" = "2" ] && echo 2                     ---------->判斷今天是否是星期2
    2
  • 計劃任務時間表示法

    1) 特定值:給定時間點有效取值範圍內的值
    2) */10 給定時間點上有效取值範圍內的所有值 表示“每...”
    3) 離散取值 :1,3,4
    4) 連續取值 :1-5
    5) 在指定時間範圍上:定義步長 /#: #即爲步長
    6) 用'@'字符修正:
           @reboot: 重啓後運行一次。
           @yearly: 每年運行一次,即。 0 0 1 1
           @annually:每年運行一次,即。 0 0 1 1

           @monthly: 每月運行一次,即。 0 0 1
           @周: 每週運行一次,即。 0 0 0
           @daily: 每天運行一次, 即。 0 0
           @hourly: 每小時運行一次,即。 0

    示例: 0
    /3 * centos /bin/echo “howdy”;/usr/bin/wall “welcome!” --------->每3小時echo和wall命令

    [root@Centos6app]#vim /etc/crontab 
    0 1 * * * root /bin/tar Jcf /app/backup`date +\%F -d "-1 day"`.tar.xz /etc &>/dev/null                 ------->%需要轉義
    [root@Centos6app]#ll -h
    -rw-r--r--. 1 root root 6.2M 12月 19 01:00 backup2017-12-18.tar.xz
    [root@Centos6app]#cat /var/log/cron
    Dec 19 01:00:01 Centos6 CROND[10418]: (root) CMD (/bin/tar Jcf /app/backup`date +%F -d "-1 day"`.tar.xz /etc &>/dev/null)
    **注意:對於cron任務來講,% 有特殊用途;如果在命令中要使用 %, 則需要轉義,將 % 放置於單引號中,則可不用轉義**
  • 確保crond守護處於運行狀態:

    CentOS 7:systemctl status crond
    CentOS 6:service crond status

    [root@Centos7~]#service crond status                                                        -------這條舊命令其實引用的就是/bin/systemctl status crond.service 這條命令
    Redirecting to /bin/systemctl status crond.service
    ● crond.service - Command Scheduler
    Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
    Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago
    Main PID: 955 (crond)
    CGroup: /system.slice/crond.service
    └─955 /usr/sbin/crond -n
    [root@Centos7~]#systemctl status crond.service atd
    ● crond.service - Command Scheduler
    Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
    Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago
    Main PID: 955 (crond)
    CGroup: /system.slice/crond.service
    └─955 /usr/sbin/crond -n
    12月 17 16:21:13 Centos7.L systemd[1]: Started Command Scheduler.
    12月 17 16:21:13 Centos7.L systemd[1]: Starting Command Scheduler...
    12月 17 16:21:13 Centos7.L crond[955]: (CRON) INFO (RANDOM_DELAY will be scaled with f...d.)
    12月 17 16:21:14 Centos7.L crond[955]: (CRON) INFO (running with inotify support)
    ● atd.service - Job spooling tools
    Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
    Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago
    Main PID: 958 (atd)
    CGroup: /system.slice/atd.service
    └─958 /usr/sbin/atd -f
    12月 17 16:21:13 Centos7.L systemd[1]: Started Job spooling tools.
    12月 17 16:21:13 Centos7.L systemd[1]: Starting Job spooling tools...
    Hint: Some lines were ellipsized, use -l to show in full.

系統的計劃任務

  • anacron系統

    運行計算機關機時cron不運行的任務,CentOS6以後版本 取消anacron服務,由crond服務管理
    對筆記本電腦、臺式機、工作站、偶爾要關機的服務器及其 它不一直開機的系統很重要對很有用
    配置文件:/etc/anacrontab,負責執行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly中系統任務。

    字段1:如果在這些日子裏沒有運行這些任務......
    字段2:在重新引導後等待這麼多分鐘後運行它
    字段3:任務識別器,在日誌文件中標識
    字段4:要執行的任務

    由/etc/cron.hourly/0anacron執行
    當執行任務時,更新/var/spool/anacron/cron.daily 文件 的時間戳

    [root@Centos6anacron]#cat /etc/anacrontab                                 --------> 查看anacrontab配置文件信息
    #/etc/anacrontab: configuration file for anacron
    #See anacron(8) and anacrontab(5) for details.
    SHELL=/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    #the maximal random delay added to the base delay of the jobs
    RANDOM_DELAY=45
    #the jobs will be started during the following hours only
    START_HOURS_RANGE=3-22
    #period in days      delay in minutes       job-identifier                  command
    1                               5                       cron.daily              nice run-parts /etc/cron.daily
    7                              25                     cron.weekly           nice run-parts /etc/cron.weekly
    @monthly                     45                       cron.monthly            nice run-parts /etc/cron.monthly`
/etc/crontab                                            ----------> 計劃任務的總配置文件,只有root用戶可以直接使用
[root@Centos6~]#ll /etc/crontab 
-rw-r--r--. 1 root root 456 12月 19 01:02 /etc/crontab

/etc/cron.d/ 配置文件                             ----------->計劃任務配置文件存放的位置,不建議全部都在/etc/crontab 文件中修改,以免因任務過多,導致錯亂
[[email protected]]#ll /etc/cron.d/
-rw-r--r--. 1 root root 113 8月  24 2016 0hourly
-rw-------. 1 root root 108 1月  26 2017 raid-check
-rw-------. 1 root root 235 3月  22 2017 sysstat

/etc/cron.hourly/                                                 ----------->  每小時需要執行的計劃任務存放位置,0anacron腳本就是anacron服務的配置文件,
[root@Centos6~]#ll /etc/cron.hourly/                                      因關機沒有執行的計劃任務,開機後每小時檢查一次,然後繼續執行相關計劃任務
-rwxr-xr-x. 1 root root 409 8月  24 2016 0anacron
[root@Centos6~]#cat /etc/cron.hourly/0anacron 
#!/bin/bash
# Skip excecution unless the date has changed from the previous run 
if test -r /var/spool/anacron/cron.daily; then
    day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
    exit 0;
fi
# Skip excecution unless AC powered
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power &> /dev/null
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s

/etc/cron.daily/                  ----------->系統每天要執行的計劃任務,這些計劃任務都是軟件安裝時自動形成的腳本,需要系統每天執行的任務就會放到這個文件夾內
[[email protected]]#ll /etc/cron.daily/
-rwx------. 1 root root  118 3月  22 2017 cups
-rwx------. 1 root root  180 7月  10 2003 logrotate
-rwx------. 1 root root  927 3月  22 2017 makewhatis.cron
-rwx------. 1 root root  189 1月  26 2015 mlocate.cron
-rwxr-xr-x. 1 root root 2126 7月  19 2013 prelink
-rwxr-xr-x. 1 root root  563 11月 23 2013 readahead.cron
-rwxr-xr-x. 1 root root  433 11月  7 2015 tmpwatch

/etc/cron.weekly/                            ----------->      每星期需要執行的計劃任務存放位置
/etc/cron.monthly/                          ----------->      每月期需要執行的計劃任務存放

[[email protected]]#ll /etc/cron
cron.d/       cron.deny     cron.monthly/ cron.weekly/
cron.daily/   cron.hourly/  crontab    

管理臨時文件

  • CentOS6使用/etc/cron.daily/tmpwatch定時清除臨時文件
  • CentOS7使用systemd-tmpfiles-setup服務實現
  • 配置文件

    /etc/tmpfiles.d/.conf
    /run/tmpfiles.d/
    .conf
    /usr/lib/tmpfiles/*.conf

  • /usr/lib/tmpfiles.d/tmp.conf

    d /tmp 1777 root root 10d
    d /var/tmp 1777 root root 30d

  • 命令:

    systemd-tmpfiles –clean|remove|create configfile

corntab 命令:用戶cron計劃任務

  • crontab命令定義,每個用戶都有專用的cron任務文件

    /var/spool/cron/USERNAME

  • crontab命令:

    用法:crontab [-u user] [-l | -r | -e] [-i]
    常用選項
    -l: 列出所有任務;
    -e: 編輯任務;
    -r: 移除所有任務; -i:同-r一同使用,以交互式模式移除指定任務
    -u user: 僅root可運行,指定用戶管理cron任務

  • 控制用戶執行計劃任務: /etc/cron.{allow,deny}
    [root@Centos6~]#ls /var/spool/cron/L                   --------->普通用戶存放cron計劃任務配置文件的位置
    /var/spool/cron/L
    [root@Centos6~]#crontab -l -u L                            --------->-l 選項只能查看自己的配置文件信息,如果需要查詢他人的,需要加-u 選項
    * * * * * wall hello                                                     ---------> **配置內容不需要增加用戶信息這項**
    [root@Centos6cron]#ll /usr/bin/crontab               ---------->**crontab 命令具有SUID權限**
    -rwsr-xr-x. 1 root root 51784 8月  24 2016 /usr/bin/crontab
    [root@Centos6anacron]#vim /etc/profile.d/env.sh       --------> 默認crontab -e 配置內容使用的vi軟件,不具有vim功能,故可以修改默認的軟件設置。
    export EDITOR=vim
    [root@Centos6~]#ll /var/spool/cron/ -d
    drwx------. 2 root root 4096 12月 19 14:55 /var/spool/cron/

at 命令

  • at、batch 命令是從標準輸入或指定的文件中讀取,將在稍後執行的命令
  • batc命令將在系統負載水平下降到特定水平時執行命令
  • atq 命令列出用戶的待處理作業,除非用戶是超級用戶;在這種情況下,每個人的工作都被列出來了。
  • atrm 命令刪除由工作號碼標識的工作
[root@Centos6~]#chkconfig --list atd                                                         --------> Centos6 上查看at命令是否開機自動啓動
atd             0:關閉    1:關閉    2:關閉    3:啓用    4:啓用    5:啓用    6:關閉
[root@Centos6~]#runlevel
5 3
[root@Centos6~]#chkconfig atd on                                                           -------->如果不是開機啓動,就用這條命令設置爲開機啓動
[root@Centos7~]#systemctl is-enabled atd.service                                 --------->Centos7 上查看at命令是否開機啓動
enabled
[root@Centos7~]#systemctl enable atd
  • 執行方式:
  • 1)交互式 2)輸入重定向 3)at –f 文件
  • 依賴與atd服務,需要啓動才能實現at任務
  • at隊列存放在/var/spool/at目錄中
[root@Centos7~]#systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 4h ago
 Main PID: 958 (atd)
   CGroup: /system.slice/atd.service
           └─958 /usr/sbin/atd -f                           ----------> 調用的就是/usr/sbin/atd 這個程序,958就是PID
[root@Centos7~]#ps aux | grep atd
root        958  0.0  0.0  25856   916 ?        Ss   16:09   0:00 /usr/sbin/atd -f
[root@Centos6~]#at 21:25                                  ---------->交互式用法
at> wall ready to off work
at> <EOT>
job 1 at 2017-12-18 21:25
[root@Centos6~]#at -l
1   2017-12-18 21:25 a root
[root@Centos6~]#ls /var/spool/at/ -l
-rwx------. 1 root   root   3232 12月 18 21:21 a000010180ede5          --------->執行後就會自動刪除文件
drwx------. 2 daemon daemon 4096 3月  22 2017 spool
[root@Centos6~]#at 21:27
at> hostname                                                                                        --------->計劃任務無法打印標準輸出內容,執行成功後的信息以郵件方式發給發起者
at> <EOT>
job 3 at 2017-12-18 21:27
[root@Centos6~]#hostname
Centos6.L
You have mail in /var/spool/mail/root
[root@Centos6~]#mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N  1 root                  Mon Dec 18 21:27  14/421   "Output from your job        3"
& 1
Message  1:
From [email protected]  Mon Dec 18 21:27:01 2017
Return-Path: <[email protected]>
X-Original-To: root
Delivered-To: [email protected]
Subject: Output from your job        3
To: [email protected]
Date: Mon, 18 Dec 2017 21:27:01 +0800 (CST)
From: [email protected] (root)
Status: R
Centos6.L                                                                             ---------> at命令執行成功的信息,所以計劃任務以及腳本建議標準輸出直接到&>/dev/null
& 
[root@Centos6~]#at 21:37 <<EOF                                       --------->在腳本中可以使用這樣方法輸入配置
> wall Good night!                                                                --------->但建議把腳本的路徑添加上,因爲默認的PASH變量路徑可能有一定出入
> EOF
job 5 at 2017-12-18 21:37
[root@Centos6~]#at -c 5                                                      --------->查看at計劃任務的信息
#!/bin/sh
# atrun uid=0 gid=0
..........
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin; export PATH      ------->變量地址
${SHELL:-/bin/sh} << 'marcinDELIMITER3692b1dd'
wall Good night!
marcinDELIMITER3692b1dd
[root@Centos6~]#echo -e "wall at job3\nwall at jobs4\nwall at jobs5"| at 21:45
job 6 at 2017-12-18 21:45
[root@Centos6~]#at -l
6   2017-12-18 21:45 a root
[root@Centos6~]#at -c 6
........
wall at job3
wall at jobs4
wall at jobs5
[root@Centos6~]#at 21:48 -m                       ----------->發送郵件確認
at> how are you
at> <EOT>
job 7 at 2017-12-18 21:48
[root@Centos6~]#at -l
7   2017-12-18 21:48 a root
[root@Centos6~]#mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
"/var/spool/mail/root": 2 messages 1 new
>N  2 root                  Mon Dec 18 21:48  14/453   "Output from your job        7"
& 2
......
Subject: Output from your job        7                  --------->來自第7個計劃任務
  • at.allow (白名單)、at.deny(黑名單)

    超級用戶可以在任何情況下使用這些命令。對於其他用戶,使用的權限由文件/etc/at.allow和/etc/at.deny確定
    如果文件/etc/at.allow存在,則只允許在其中提及的用戶名在
    如果/etc/at.allow不存在,則檢查/etc/at.deny,然後允許在其中未提及的每個用戶名使用at
    如果不存在,則只允許超級用戶使用 at 命令,一個空的/etc/at.deny意味着每個用戶都可以使用這些命令,這是默認配置

[root@Centos6~]#cat /etc/at.deny                    ---------->默認黑名單爲空,所有用戶都可以用at命令制定計劃任務

[root@Centos6~]#cat /etc/at.allow                   ---------->默認沒有白名單這個文件,如果使用需要手工創建
cat: /etc/at.allow: 沒有那個文件或目錄
  • 常用參數

    -m 當任務被完成之後,將給用戶發送郵件,即使沒有標準輸出
    -M 永遠不會發送郵件給用戶
    -f 從指定的文件讀取作業而不是標準輸入
    -l 是atq的別名
    -r 是atrm的別名
     -d 是atrm的別名
     -v 顯示在閱讀作業之前作業將被執行的時間。顯示的時間將採用格式“Thu Feb 20 14:50:00 1997”
      -c 將命令行上列出的作業捕獲到標準輸出(查看具體的作業任務)

  • 示例
  • at命令接受HH:MM形式的時間在一天的特定時間託管一個工作。(如果時間已經過去,則假定是第二天)。
  • 也可以指定午夜,中午或下午茶時間(下午4點),並且可以在上午或下午晚間。
  • 也可以通過在選擇年份的月份名稱日期中給出日期,或者給出MMDDYY或MM / DD / YY或DD.MM.YY或YYYY的日期來說明工作將在哪一天運行-MM-DD。
  • 日期的規格必須遵循當天的規格。也可以給出像現在這樣的時間+計算時間單位,其中時間單位可以是幾分鐘,幾小時,幾天或幾周,

HH:MM 02:00

在今日的 HH:MM 進行,若該時刻已過,則明天此時執行任務

HH:MM YYYY-MM-DD 02:00 2016-09-20

規定在某年某月的某一天的特殊時刻進行該項任務

HH:MM[am|pm] [Month] [Date]

04pm March 17
17:20 tomorrow

HH:MM[am|pm] + number [minutes|hours|days|weeks]

在某個時間點再加幾個時間後才進行該項任務
now + 5 minutes
02pm + 3 days

at和crontab 對比

  • 一次性作業使用 at
  • 重複性作業使用crontab
    Create           at time                        crontab -e
    List                at -l                             crontab -l 
    Details           at -c jobnum               N/A 
    Remove         at -d jobnum               crontab -r 
    Edit                N/A                              crontab -e
  • 沒有被重定向的輸出會被郵寄給用戶
  • 根用戶能夠修改其它用戶的作業
  • 注意:運行結果的標準輸出和錯誤以郵件通知給相關用戶

    (1) COMMAND > /dev/null
    (2) COMMAND &> /dev/null

  • 對於cron任務來講,%有特殊用途;如果在命令中要使用%, 則需要轉義,將%放置於單引號中,則可不用轉義

* 1) 如何在秒級別運行任務?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
* 2) 如何實現每7分鐘運行一次任務? 
* sleep命令:
          sleep NUMBER[SUFFIX]... 
                          SUFFIX:
                                 s: 秒, 默認 m: 分
                                 h: 小時
                                 d: 天

並行運行

  • 同時運行多個進程,提高效率

    方法1

    vi all.sh f1.sh& f2.sh& f3.sh&

    方法2

    (f1.sh&);(f2.sh&);(f3.sh&)

    方法3

    { f1.sh& f2.sh& f3.sh& }

 1、每天的2點和12點整,將/etc備份至/testdir/backup目 錄中,保存的文件名稱格式爲“etcbak-yyyy-mm-dd-HH.tar.xz”
 0 2,12 * * * root /bin/tar Jcf /testdir/backup/etcbak`date +\%Y-\%m-\%d-\%H`.tar.xz /etc &>/dev/null

 2、每週2, 4, 7備份/var/log/messages文件至/logs目錄中 ,文件名形如“messages-yyyymmdd”
0 0 * * 2,4,7 root /bin/tar Jcf /logs/messages-`date +\%F` /var/log/messages &>/dev/null

 3、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
0 */2 * * * root cat /proc/meminfo | egrep "^S|^M" >> /tmp/meminfo.txt

 4、工作日時間,每10分鐘執行一次磁盤空間檢查,一旦發現 任何分區利用率高於80%,就執行wall警報
*/10 0 * * 1-5 root /app/disk.sh                     -------->因命令內容過多,建議寫到一個簡單腳本中,腳本內容如下
/app/disk.sh
disk=`df | grep "/dev/sd" | sort -r | head -n1`
[ "$disk" > 80% ] && wall "disk will be full"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章