定時任務說明與分類
定時任務的應用場景舉例
每天晚上 12點備份/etc/目錄
tar
定時任務的三種分類
crond(crontab)定時任務軟件(軟件包cronie),用的最多的一種
atd,應用在只運行一次的任務
anacron ,非7*24小時運行的服務器(比如開機多長時間運行,關機多長時間運行)

[root@Dao ~]# rpm -qa cronie 查看安裝的cronie軟件版本 cronie-1.4.4-16.el6_8.2.x86_64 [root@Dao ~]# rpm -ql cronie 查看軟件包詳細列表 /etc/cron.d /etc/cron.d/0hourly /etc/cron.deny /etc/pam.d/crond /etc/rc.d/init.d/crond # crond定時軟件 /etc/sysconfig/crond /usr/bin/crontab /usr/sbin/crond /usr/share/doc/cronie-1.4.4 /usr/share/doc/cronie-1.4.4/AUTHORS /usr/share/doc/cronie-1.4.4/COPYING /usr/share/doc/cronie-1.4.4/ChangeLog /usr/share/doc/cronie-1.4.4/INSTALL /usr/share/doc/cronie-1.4.4/README /usr/share/man/man1/crontab.1.gz /usr/share/man/man5/crontab.5.gz /usr/share/man/man8/cron.8.gz /usr/share/man/man8/crond.8.gz /var/spool/cron
用戶與系統定時任務
系統定時任務
系統定時任務主要和四個文件有關(cron.daily、cron.hourly、cron.monthly、cron.weekly)
系統會定時自動運行文件里面的內容
[root@Dao ~]# ls -l /etc/ |grep cron. -rw------- 1 root root 541 Aug 24 2016 anacrontab drwxr-xr-x. 2 root root 4096 Jan 24 21:32 cron.d drwxr-xr-x. 2 root root 4096 Sep 27 2011 cron.daily # 每天 -rw------- 1 root root 0 Aug 24 2016 cron.deny drwxr-xr-x. 2 root root 4096 Jan 24 21:32 cron.hourly # 每小時 drwxr-xr-x 2 root root 4096 Sep 27 2011 cron.monthly # 每月 -rw-r--r-- 1 root root 457 Sep 27 2011 crontab # 系統定時任務的配置文件之一 drwxr-xr-x 2 root root 4096 Sep 27 2011 cron.weekly # 每周 #有些病毒會在文件中插入定時任務,自動運行,所以很難徹底清除
系統定時任務相關:系統定時任務+logrotate命令 完成對 日志的日志切割、日志輪詢
定時對這幾個文件進行切割
/var/log/cron /var/log/secure /var/log/messages
查看日志目錄下的日志文件
[root@Dao ~]# ls -l /var/log/secure* /var/log/messages* -rw------- 1 root root 1498 Jan 24 21:32 /var/log/messages -rw------- 1 root root 438 Dec 12 12:27 /var/log/messages-20181216 -rw------- 1 root root 141 Dec 16 03:29 /var/log/messages-20181223 -rw------- 1 root root 141 Dec 23 03:14 /var/log/messages-20181230 -rw------- 1 root root 206 Jan 3 12:40 /var/log/messages-20190106 -rw------- 1 root root 45504 Jan 29 21:13 /var/log/secure -rw------- 1 root root 40715 Dec 16 01:10 /var/log/secure-20181216 -rw------- 1 root root 49052 Dec 23 02:34 /var/log/secure-20181223 -rw------- 1 root root 22145 Dec 30 03:08 /var/log/secure-20181230 -rw------- 1 root root 33336 Jan 5 23:38 /var/log/secure-20190106
logrotate里面的內容
[root@Dao ~]# cat /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0 [root@Dao ~]# cat /etc/logrotate.d/syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript }
用戶的定時任務
使用的幾個命令
crontab -l (list) #查看用戶的定時任務(列表)cron table crontab -e (edit) #編輯用戶的定時任務 /var/spool/cron/root #(root是用戶名 root用戶的定時任務)用戶定時任務存放的目錄
第一次用的時候回提示
[root@Dao ~]# crontab -l no crontab for root #用戶沒有定時任務
注:Linux中,每個用戶的定時任務是分開的
在定時任務中添加項目
[root@Dao ~]# crontab -e 編輯定時任務 # 和vim的操作是一樣的,我寫入了# pizza然后保存退出 no crontab for root - using an empty one crontab: installing new crontab [root@Dao ~]# crontab -l # pizza
定時任務的使用
在使用之前,一定要確保定時任務依賴的軟件(服務)是否可以使用
# 查看定時任務是否在運行 # 第一種方法 [root@Dao ~]# /etc/init.d/crond status crond is stopped # 第二種方法 [root@Dao ~]# ps -ef |grep crond root 17714 17688 0 22:01 pts/0 00:00:00 grep crond # 查看定時任務,是不是開機自啟動,要保證重啟后也在運行 [root@Dao ~]# chkconfig |grep crond crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off # 3 位置是on就是開機自啟動了
定時任務的開啟和關閉
[root@Dao ~]# /etc/init.d/crond start Starting crond: [ OK ] [root@Dao ~]# /etc/init.d/crond status crond (pid 17733) is running... [root@Dao ~]# /etc/init.d/crond stop Stopping crond: [ OK ] [root@Dao ~]# /etc/init.d/crond status crond is stopped
定時任務的開機啟動關閉和開啟
[root@Dao ~]# chkconfig crond off [root@Dao ~]# chkconfig |grep crond crond 0:off 1:off 2:off 3:off 4:off 5:off 6:off [root@Dao ~]# chkconfig crond on crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
如何用crontab?
[root@Dao ~]# crontab --help crontab: invalid option -- '-' crontab: usage error: unrecognized option usage: crontab [-u user] file crontab [-u user] [ -e | -l | -r ] (default operation is replace, per 1003.2) -e (edit user's crontab) #查看列表 就相當於在查看/var/spool/cron/root -l (list user's crontab) #編輯 就相當於在編輯 /var/spool/cron/root -r (delete user's crontab) #把當前都刪掉,無提示,直接刪 -i (prompt before deleting user's crontab) #刪除之前提示 -s (selinux context)
為什么使用crontab命令,而不是直接操作/var/spool/cron/root這個文件呢?
1、命令有語法檢查功能,
2、更方便
定時任務相關的文件
/var/spool/cron/ # 定時任務的配置文件所在目錄 /var/log/cron # 定時任務的日志文件 運行過程的一個記錄,無法顯示運行的對不對 /etc/cron.deny # 哪些用戶禁止使用定時任務 - 定時任務黑名單
關於如何看日志
定時任務格式與常見寫法
格式說明
什么時間做什么事情
時間分為5個部分-----分時日月周,事情就是命令或者腳本
兩個例子
定時任務常用符號
* #每 /n #隔 */10 * * * * 表示每隔10分鍾 - #從哪到哪 07-08 , #分隔 17,18,21
例子
題目:每5分鍾同步一下系統的時間
#第一個里程碑-命令 ntpdate ntp1.aliyun.com #注意:編寫定時任務要使用命令的絕對路徑 /usr/sbin/ntpdate ntp1.aliyun.com #第二個里程碑-寫入定時任務 crontab -e #在文件中寫入 # sync time by pizza at 20190123 00:15 */5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com #第三個里程碑-檢查 ##1)看日志 tail -f /var/log/cron ##2)看結果 查看時間是否在跟新(可以先手動更改)
注:You have mail in /var/spool/mail/root
在修改時間時,會出現這句話。下面會說到
題目:每天的上午7點到11點,每一個小時運行cmd命令
# 注意:在寫小時的時候,一定要加上00,否則就表示沒分鍾 * 07-11 * * * CMD # 表示沒分鍾都運行 00 07-11 * * * CMD # 表示每個小時都運行
題目:每分鍾把自己的名字 追加到/oldboy/oldboy.txt
依照上面的流程:命令----寫入----檢查
* * * * * echo `whoami` >> /oldboy/oldboy.txt
定時任務的書寫流程總結
#1、命令行測試 #2、把命令放入腳本中(命令多的時候) #3、測試腳本是否可以使用 #4、寫定時任務 #5、檢查結果
定時任務九句箴言
01、定時任務命令之前要加一行注釋
注:注釋中寫清楚備注信息,誰在什么時間做什么
02、在寫定時任務的時候,使用腳本替代命令
注:超過兩條命令都使用腳本
題目:每分鍾顯示當前系統的時間(年-月-日),追加到/tmp/time.log中
##01、命令 [root@learn-Linux001 ~]# date +%F 2019-01-30 ##02、腳本 [root@learn-Linux001 ~]# mkdir -p /server/scripts 將腳本都放在/server/scripts目錄下 [root@learn-Linux001 ~]# vim /server/scripts/date.sh 創建腳本,寫入命令 [root@learn-Linux001 ~]# sh /server/scripts/date.sh 2019-01-30 因為創建的文件沒有執行權限(默認644),所以我們使用sh來執行 [root@learn-Linux001 ~]# sh /server/scripts/date.sh >>/tmp/date.log [root@learn-Linux001 ~]# cat /tmp/date.log 2019-01-30 測試腳本,成功 ##03、腳本寫入定時任務 # print date to file by pizza at 20190128 18:50 * * * * * /bin/sh /server/scripts/date.sh >>/tmp/date.log 使用命令的絕對路徑 ##04、檢查(看日志,看結果) tail -f /etc/log/cron tail -f /tmp/date.log
03、定時任務中date命令%百分號
當我們在定時任務中,直接使用命令獲取時間,得到的結果為空
通過查看日志,發現,執行的命令是date +
因為,%后面的內容內忽略了,如果一定要使用,可以帶上撬棍(\)
* * * * * date +\%F-\%T >> /tmp/time.txt >&1
04、運行腳本一定要使用/bin/sh
在創建腳本的時候,以sh為后綴
05、把命令或者腳本的結果定向到文件中
定時任務中,命令或者腳本結果(正確或錯誤)定向到黑洞(>/dev/null 2>&1)或追加到文件中(>> /tmp/oldboy.txt 2>&1)
否則,就會導致故障
企業案例
如果沒有上面所說的操作,很容易導致硬盤inode空間被占滿,從而導致系統服務不正常
定時任務中,命令或者腳本的結果,沒有定向到空或者文件中,系統會發郵件 #1、郵件的軟件沒有開啟------大量的小文件堆積在/var/spool/postfix/maildrop/ ---inode滿了 #2、郵件軟件開啟了------定時任務會不斷的給root用戶發郵件 you have new mail in /var/spool/mail/root #查看郵件服務開啟沒有? [root@learn-Linux001 ~]# /etc/init.d/postfix status master (pid 1592) is running...
06、避免不必要的程序及命令輸出
tar zcf
tar zcvf 不可取
07、創建壓縮包使用相對路徑
切到目標目錄的上一級打包目標
[root@learn-Linux001 ~]# cd / [root@learn-Linux001 /]# tar zcf /tmp/ser-$(date +%F).tar etc/services 或者 cd / && tar zcf /tmp/ser-$(date +%F).tar etc/services
08、定時任務腳本中的程序文件,盡量使用絕對路徑
否則,可能會出現找不到命令的錯誤
因為,定時任務運行腳本的時候可以識別的PATH只有 /usr/bin 和 /bin
解決方法: #1、使用絕對路徑 /sbin/ifconfig #2、在腳本開頭重新定義一下PATH ## export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
用戶的定時任務,默認要存放在當前用戶的家目錄
系統的定時任務,默認要存放在根目錄下
09、系統與命令位置有關的環境變量問題
01)、定時任務運行腳本的時候可以識別的PATH只有 /usr/bin 和 /bin
02)、java環境變量故障案例
linux定時任務生產java服務無法執行問題案例http://oldboy.blog.51cto.com/2561410/1541515
補充:刪除大量堆積小文件
創建環境
[root@learn-Linux001 oldboy]# touch {1..500000}.txt -bash: /bin/touch: Argument list too long # 數量太多,無法運行,使用下面的方法 [root@learn-Linux001 oldboy]# echo {1..500000}.txt|xargs touch
最后導致no space left on device
[root@learn-Linux001 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 6.9G 1.5G 5.1G 22% / tmpfs 926M 0 926M 0% /dev/shm /dev/sda1 190M 35M 146M 19% /boot [root@learn-Linux001 ~]# df -hi Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 452K 452K 0 100% / tmpfs 232K 1 232K 1% /dev/shm /dev/sda1 50K 38 50K 1% /boot
是因為inode滿了
[root@learn-Linux001 ~]# cd /oldboy/ [root@learn-Linux001 oldboy]# rm -f * -bash: /bin/rm: Argument list too long 直接刪除失敗 [root@learn-Linux001 oldboy]# ls |xargs rm -f
[root@learn-Linux001 oldboy]# ll
total 0 這樣刪除,成功(刪除小文件)
可能會遇到更多的文件,這樣也不能刪除
解決辦法是,篩選后進行批量刪除
定時任務總結
待...