Linux之定時任務crond

定時任務說明與分類

定時任務的應用場景舉例

天天晚上 12點備份/etc/目錄java

tarnode

定時任務的三種分類

crond(crontab)定時任務軟件(軟件包cronie),用的最多的一種linux

atd,應用在只運行一次的任務vim

anacron ,非7*24小時運行的服務器(好比開機多長時間運行,關機多長時間運行)bash

[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
View Code

 

用戶與系統定時任務

系統定時任務

系統定時任務主要和四個文件有關(cron.daily、cron.hourly、cron.monthly、cron.weekly)服務器

系統會定時自動運行文件裏面的內容ide

[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命令 完成對 日誌的日誌切割、日誌輪詢post

定時對這幾個文件進行切割
/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裏面的內容url

[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、命令有語法檢查功能,
二、更方便

 

 

 

定時任務相關的文件

/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

定時任務的書寫流程總結

#一、命令行測試
#二、把命令放入腳本中(命令多的時候)
#三、測試腳本是否可使用
#四、寫定時任務
#五、檢查結果

 

 

定時任務九句箴言

0一、定時任務命令以前要加一行註釋

注:註釋中寫清楚備註信息,誰在什麼時間作什麼

0二、在寫定時任務的時候,使用腳本替代命令

注:超過兩條命令都使用腳本

題目:每分鐘顯示當前系統的時間(年-月-日),追加到/tmp/time.log中

##0一、命令
[root@learn-Linux001 ~]# date +%F
2019-01-30
##0二、腳本
[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
測試腳本,成功
##0三、腳本寫入定時任務
# print date to file by pizza at 20190128 18:50
* * * * * /bin/sh  /server/scripts/date.sh >>/tmp/date.log
使用命令的絕對路徑
##0四、檢查(看日誌,看結果)
tail -f /etc/log/cron
tail -f /tmp/date.log

 

 

0三、定時任務中date命令%百分號

當咱們在定時任務中,直接使用命令獲取時間,獲得的結果爲空

經過查看日誌,發現,執行的命令是date +

由於,%後面的內容內忽略了,若是必定要使用,能夠帶上撬棍(\)

* * * * * date +\%F-\%T >> /tmp/time.txt >&1

 

0四、運行腳本必定要使用/bin/sh

在建立腳本的時候,以sh爲後綴

 

0五、把命令或者腳本的結果定向到文件中

定時任務中,命令或者腳本結果(正確或錯誤)定向到黑洞(>/dev/null 2>&1)或追加到文件中(>> /tmp/oldboy.txt 2>&1)

不然,就會致使故障

企業案例

若是沒有上面所說的操做,很容易致使硬盤inode空間被佔滿,從而致使系統服務不正常

定時任務中,命令或者腳本的結果,沒有定向到空或者文件中,系統會發郵件
#一、郵件的軟件沒有開啓------大量的小文件堆積在/var/spool/postfix/maildrop/  ---inode滿了
#二、郵件軟件開啓了------定時任務會不斷的給root用戶發郵件
you  have  new  mail  in  /var/spool/mail/root

#查看郵件服務開啓沒有?
[root@learn-Linux001 ~]# /etc/init.d/postfix status
master (pid  1592) is running...

 

 

0六、避免沒必要要的程序及命令輸出

tar  zcf

tar  zcvf    不可取

0七、建立壓縮包使用相對路徑

切到目標目錄的上一級打包目標

[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 

0八、定時任務腳本中的程序文件,儘可能使用絕對路徑

不然,可能會出現找不到命令的錯誤

由於,定時任務運行腳本的時候能夠識別的PATH只有 /usr/bin 和 /bin

解決方法:

#一、使用絕對路徑  /sbin/ifconfig
#二、在腳本開頭從新定義一下PATH
##  export  PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 

用戶的定時任務,默認要存放在當前用戶的家目錄

系統的定時任務,默認要存放在根目錄下

0九、系統與命令位置有關的環境變量問題

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
這樣刪除,成功(刪除小文件)
可能會遇到更多的文件,這樣也不能刪除
解決辦法是,篩選後進行批量刪除

 

定時任務總結

 待...

相關文章
相關標籤/搜索