《LINUX實操:Linux基礎教程:任務計劃和周期性任務》要點:
本文介紹了LINUX實操:Linux基礎教程:任務計劃和周期性任務,希望對您有用。如果有疑問,可以聯系我們。
在我們的生活中,有的工作是例行的,例如每年一次加薪、每年給女朋友過一次生日、每天上班都要打卡等,有的工作是臨時發生的,例如明天朋友要來訪,你需要準備午餐等等.
at:一般用于未來某一個時間點去執行一次某某任務,要記住,只執行一次,所有at很適合那些臨時的任務;
crontab:周期性的去運行某任務,所以適合那些周期性的任務.
在寫at和crontab之前,我們先來簡單的看一下本地的電子郵件服務----mailx,mailx的用途就是用來發送和接受網絡郵件.
用法(這里只簡單的談一下,以便后面介紹at和crontab,詳細的可以見man手冊):
mailx [-s 'SUBJECT'] username[@hostname] #使用mail也可以
每個用戶在/var/spool/mail/目錄下都有一個以自己名字命令的"郵筒",可以用來接收郵件!
1.通過交互式的方式生成郵件正文,我們讓root用戶給frank用戶發個郵件:
[root@localhost ~]# mailx -s "hello frank" frank@localhost.localdomain #-s指定郵件標題,本地用戶@hostname可以去掉 how are you? I am root! . EOT
frank用戶收郵件:
[frank@localhost ~]$ mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/frank": 1 message 1 new >N 1 root Mon Sep 4 11:43 19/654 "hello frank" & 1 #輸入序號即可查看文件內容 Message 1: From root@localhost.localdomain Mon Sep 4 11:43:30 2017 Return-Path: <root@localhost.localdomain> X-Original-To: frank@localhost.localdomain Delivered-To: frank@localhost.localdomain Date: Mon, 04 Sep 2017 11:43:30 -0400 To: frank@localhost.localdomain Subject: hello frank #郵件標題 User-Agent: Heirloom mailx 12.5 7/5/10 #用戶收發郵件的工具程序 Content-Type: text/plain; charset=us-ascii From: root@localhost.localdomain (root) Status: R how are you? #郵件正文 I am root!
[frank@localhost tmp]$ mailx -s "hello root" root < /tmp/hello.txt #這里我們省去了hostname
root收郵件并查看:
[root@localhost ~]# You have mail in /var/spool/mail/root #看吧!這里會彈出提示,告訴你有一封郵件! [root@localhost ~]# [root@localhost ~]# mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 1 message 1 new >N 1 frank Mon Sep 4 11:56 19/629 "hello root" & 1 Message 1: From frank@localhost.localdomain Mon Sep 4 11:56:31 2017 Return-Path: <frank@localhost.localdomain> X-Original-To: root Delivered-To: root@localhost.localdomain Date: Mon, 04 Sep 2017 11:56:31 -0400 To: root@localhost.localdomain Subject: hello root User-Agent: Heirloom mailx 12.5 7/5/10 Content-Type: text/plain; charset=us-ascii From: frank@localhost.localdomain (frank) Status: R I am ok! and you? & q #q退出 Held 1 message in /var/spool/mail/root
[root@localhost ~]# cat /tmp/hello2.txt | mail -s "hey Frank" frank #使用mail和mailx都是可以的
frank來收郵件查看:
[frank@localhost tmp]$ mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/frank": 2 messages 1 new 1 root Mon Sep 4 11:43 20/665 "hello frank" >N 2 root Mon Sep 4 12:05 19/622 "hey Frank" & 2 Message 2: From root@localhost.localdomain Mon Sep 4 12:05:27 2017 Return-Path: <root@localhost.localdomain> X-Original-To: frank Delivered-To: frank@localhost.localdomain Date: Mon, 04 Sep 2017 12:05:27 -0400 To: frank@localhost.localdomain Subject: hey Frank User-Agent: Heirloom mailx 12.5 7/5/10 Content-Type: text/plain; charset=us-ascii From: root@localhost.localdomain (root) Status: R I am fine too!
好了,郵件服務就暫時寫到這里,想要了解的更詳細可見參考man手冊,下面我們就來進入正式的主題吧!
at命令一般用于臨時的任務,只會執行一次,at執行的結果都會以郵件的形式發給提交作業的用戶.
語法: at [OPTION]... TIME 選項: -l:查看作業隊列,相當于atq -f /path/from/somefile:從指定的文件讀取作業任務,而不是交互式的輸入 -d:刪除指定的作業,相當于atrm -c:查看指定作業的具體內容 -q:指定隊列 TIME: 精確的時間:HH:MM [YYYY-mm-dd] 00:13 2017-09-05 模糊的時間:noon,midnight,teatime,tomorrow 加:now + # now + 5 minutes 5分鐘后,單位有:minutes hours days weeks
下面我們就來使用:
[root@localhost ~]# at now + 2 minutes at> cat /etc/passwd at> <EOT> #輸入<EOT>或者使用ctrl+d job 6 at Mon Sep 4 12:26:00 2017
2分鐘后我們收到一封郵件:
[root@localhost ~]# mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 4 messages 1 unread 1 frank Mon Sep 4 11:56 20/640 "hello root" 2 root Mon Sep 4 12:21 17/596 "Output from your job 2" 3 root Mon Sep 4 12:24 15/514 "Output from your job 3" >U 4 root Mon Sep 4 12:26 36/1561 "Output from your job 6" & 4 Message 4: From root@localhost.localdomain Mon Sep 4 12:26:00 2017 Return-Path: <root@localhost.localdomain> X-Original-To: root Delivered-To: root@localhost.localdomain Subject: Output from your job 6 To: root@localhost.localdomain Date: Mon, 4 Sep 2017 12:26:00 -0400 (EDT) From: root@localhost.localdomain (root) Status: RO root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt ....(略)
查看作業隊列:
[root@localhost ~]# at -l #也可以使用atq 7 Mon Sep 4 12:29:00 2017 a root
從指定的文件去讀取作業任務:
[root@localhost ~]# at -f myat.txt 12:36 job 9 at Mon Sep 4 12:36:00 2017 [root@localhost ~]# atq #查看作業隊列,相當at -l 9 Mon Sep 4 12:36:00 2017 a root
使用-c查看指定作業的具體內容:
[root@localhost ~]# at -c 10 #!/bin/sh # atrun uid=0 gid=0 # mail root 0 umask 22 XDG_SESSION_ID=9; export XDG_SESSION_ID HOSTNAME=localhost.localdomain; export HOSTNAME SELINUX_ROLE_REQUESTED=; export SELINUX_ROLE_REQUESTED SHELL=/bin/bash; export SHELL HISTSIZE=1000; export HISTSIZE SSH_CLIENT=192.168.122.1\ 62021\ 22; export SSH_CLIENT SELINUX_USE_CURRENT_RANGE=; export SELINUX_USE_CURRENT_RANGE SSH_TTY=/dev/pts/0; export SSH_TTY USER=root; export USER LS_COLORS=rs=0:di=01\;34:ln=01\;36:mh=00:pi=40\;33:so=01\;35:do=01\;35:bd=40\;33\;01:cd=40\;33\;01:or=40\;31\;01:mi=01\;05\;37\;41:su=37\;41:sg=30\;43:ca=30\;41:tw=30\;42:ow=34\;42:st=37\;44:ex=01\;32:\*.tar=01\;31:\*.tgz=01\;31:\*.arc=01\;31:\*.arj=01\;31:\*.taz=01\;31:\*.lha=01\;31:\*.lz4=01\;31:\*.lzh=01\;31:\*.lzma=01\;31:\*.tlz=01\;31:\*.txz=01\;31:\*.tzo=01\;31:\*.t7z=01\;31:\*.zip=01\;31:\*.z=01\;31:\*.Z=01\;31:\*.dz=01\;31:\*.gz=01\;31:\*.lrz=01\;31:\*.lz=01\;31:\*.lzo=01\;31:\*.xz=01\;31:\*.bz2=01\;31:\*.bz=01\;31:\*.tbz=01\;31:\*.tbz2=01\;31:\*.tz=01\;31:\*.deb=01\;31:\*.rpm=01\;31:\*.jar=01\;31:\*.war=01\;31:\*.ear=01\;31:\*.sar=01\;31:\*.rar=01\;31:\*.alz=01\;31:\*.ace=01\;31:\*.zoo=01\;31:\*.cpio=01\;31:\*.7z=01\;31:\*.rz=01\;31:\*.cab=01\;31:\*.jpg=01\;35:\*.jpeg=01\;35:\*.gif=01\;35:\*.bmp=01\;35:\*.pbm=01\;35:\*.pgm=01\;35:\*.ppm=01\;35:\*.tga=01\;35:\*.xbm=01\;35:\*.xpm=01\;35:\*.tif=01\;35:\*.tiff=01\;35:\*.png=01\;35:\*.svg=01\;35:\*.svgz=01\;35:\*.mng=01\;35:\*.pcx=01\;35:\*.mov=01\;35:\*.mpg=01\;35:\*.mpeg=01\;35:\*.m2v=01\;35:\*.mkv=01\;35:\*.webm=01\;35:\*.ogm=01\;35:\*.mp4=01\;35:\*.m4v=01\;35:\*.mp4v=01\;35:\*.vob=01\;35:\*.qt=01\;35:\*.nuv=01\;35:\*.wmv=01\;35:\*.asf=01\;35:\*.rm=01\;35:\*.rmvb=01\;35:\*.flc=01\;35:\*.avi=01\;35:\*.fli=01\;35:\*.flv=01\;35:\*.gl=01\;35:\*.dl=01\;35:\*.xcf=01\;35:\*.xwd=01\;35:\*.yuv=01\;35:\*.cgm=01\;35:\*.emf=01\;35:\*.axv=01\;35:\*.anx=01\;35:\*.ogv=01\;35:\*.ogx=01\;35:\*.aac=01\;36:\*.au=01\;36:\*.flac=01\;36:\*.mid=01\;36:\*.midi=01\;36:\*.mka=01\;36:\*.mp3=01\;36:\*.mpc=01\;36:\*.ogg=01\;36:\*.ra=01\;36:\*.wav=01\;36:\*.axa=01\;36:\*.oga=01\;36:\*.spx=01\;36:\*.xspf=01\;36:; export LS_COLORS MAIL=/var/spool/mail/root; export MAIL PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin; export PATH PWD=/root; export PWD LANG=en_US.UTF-8; export LANG SELINUX_LEVEL_REQUESTED=; export SELINUX_LEVEL_REQUESTED HISTCONTROL=ignoredups; export HISTCONTROL SHLVL=1; export SHLVL HOME=/root; export HOME LOGNAME=root; export LOGNAME SSH_CONNECTION=192.168.122.1\ 62021\ 192.168.122.128\ 22; export SSH_CONNECTION LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR cd /root || { echo 'Execution directory inaccessible' >&2 exit 1 } ${SHELL:-/bin/sh} << 'marcinDELIMITER02cdeaba' echo "hello" cat /tmp/hello.txt cat /etc/passwd
[root@localhost ~]# uptime 12:57:06 up 5:41, 3 users, load average: 0.00, 0.01, 0.05 #好吧,現在幾乎沒有負載 [root@localhost ~]# batch at> /usr/bin/updatedb at> <EOT> job 12 at Mon Sep 4 12:51:00 2017
同樣batch同樣也可以使用atq和atrm來管理.
循環周期性的任務是由cron(crond)這個系統服務控制的,因為linux上原本就有很多的循環周期性的任務,例如系統會周期性的刪除/tmp目錄下的臨時文件.linux也給管理員和用戶提供了控制循環周期性任務的命令——crontab.
服務程序cronie提供了crond守護進程及相關的輔助工具:
[frank@localhost ~]$ rpm -q cronie cronie-1.4.11-14.el7_2.1.x86_64
[root@localhost ~]# systemctl status crond.service ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2017-08-10 07:16:37 EDT; 3 weeks 4 days ago Main PID: 682 (crond) CGroup: /system.slice/crond.service └─682 /usr/sbin/crond -n Aug 10 07:16:37 localhost.localdomain systemd[1]: Started Command Scheduler. Aug 10 07:16:37 localhost.localdomain systemd[1]: Starting Command Scheduler... Aug 10 07:16:37 localhost.localdomain crond[682]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 8% if used.) Aug 10 07:16:37 localhost.localdomain crond[682]: (CRON) INFO (running with inotify support)
在centos6中使用:
[root@localhost ~]# service crond status #centos7也支持
?向crond提交作業的方式不同于at,它需要使用專用的配置文件,此文件有固定的格式,不建議使用文本編輯器直接編輯,要使用crontab.文本編輯器編輯保留退出時不會檢查語法錯誤,而使用crontab保留退出會檢查語法錯誤.
cron的任務分為兩類:
1.系統cron任務,主要用戶實現系統自身的維護,一般手動編輯/etc/crontab文件,如果修改后不能馬上執行,可以手動的重啟這個服務 systemctl restart crond;
2.用戶cron任務,一般使用crontab命令.
好的,我們現在來看一下系統cron的配置文件/etc/crondtab吧!
[root@localhost ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # 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)特定值 給定時間點有效取值范圍內的值 注意:day of week 和day of mouth一般不同時使用 (2)* 給定時間點有效取值范圍內的所有值,表示每... (3)離散取值 在時間點上使用逗號分隔的多個值:#,#,# (4)連續取值 在時間點上使用逗號分隔的多個值:#-# (5)在指定時間上,定義步長 /#,#即步長
示例:
(1) 3 * * * *:每小時執行一次;每小時的第3分鐘; (2) 3 4 * * 5:每周執行一次;每周5的4點3分; (3) 5 6 7 * *:每月執行一次;每月的7號的6點5分; (4) 7 8 9 10 *:每年執行一次;每年的10月9號8點7分; (5) 9 8 * * 3,7:每周三和周日的8點7分 (6) 0 8,20 * * 3,7:每周三和周日的20點和20點8分執行; (7) 0 9-18 * * 1-5:每周一到周五的早上9點到18點 (8) */5 * * * *:每5分鐘執行一次某任務;
語法:crontab [OPTIONS] OPTIONS: -e:編輯任務 -l:列出所有任務 -r:移除所有的任務,即刪除/var/spool/cron/USERNAME文件 -i:在使用-r選項移除所有任務提示用戶 -u user:root用戶可為指定用戶管理cron任務
[frank@localhost ~]$ crontab -e no crontab for frank - using an empty one * * * * * echo "hello"
列出所有的任務:
[frank@localhost ~]$ crontab -l * * * * * echo "hello"
移除所有的任務:
[frank@localhost ~]$ crontab -r [frank@localhost ~]$ crontab -l no crontab for frank
運行的結果以郵件通知給當前的用戶,如果拒絕接受郵件,可以使用輸出重定向:
?COMMAND > /dev/null
注意:定義COMMAND時,如果命令需要用到%,需要對其轉義,但放置于單引號中的%不用轉義.
crond服務讀取配置文件的位置:
一般來說,crond預設有三個地方會有執行的腳本配置,他們分別是:
/etc/crontab
/etc/cron.d/*
/var/spool/cron/*
前兩個是與系統運作有關系,最后一個主要用戶用自己.
下面我們來看一下/etc/cron.d/目錄下的文件吧!
[root@localhost ~]# ll /etc/cron.d/ total 4 -rw-r--r--. 1 root root 128 Mar 31 2016 0hourly [root@localhost ~]# cat /etc/cron.d/0hourly # Run the hourly jobs SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 01 * * * * root run-parts /etc/cron.hourly #run-parts腳本會在大約5分鐘內隨機選擇一個時間去執行/etc/cron.hourly內的所有文件
[root@localhost ~]# cat /etc/cron #細心的朋友會發現etc目錄下還有很多關于crond的文件 cron.d/ cron.daily/ cron.deny cron.hourly/ cron.monthly/ crontab cron.weekly/
思考:某任務在指定的時間因關機未能執行,下次開機會不會自動執行?
答案:不會!.
如果期望某時間因故未能按時執行,下次開機后無論是否到了相應時間點都要執行一次,可使用anacron實現,在?/etc/?底下其實還有?/etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/,那三個目錄是代表每日、每周、每月各執行一次的意思,跟?/etc/cron.hourly/?不太一樣的是,這三個目錄是由?anacron?所執行的,而?anacron?的執行方式則是放在/etc/cron.hourly/0anacron?里面的.
本文永久更新鏈接地址:
維易PHP培訓學院每天發布《LINUX實操:Linux基礎教程:任務計劃和周期性任務》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7055.html