crontab

1.1 crond定義 php

crond 按期執行命令,服務或軟件,默認每分鐘檢查一次,如同咱們的生活中的鬧鐘。定時任務 也叫計劃任務 html

【知識點回顧】 java

程序:程序代碼組成,可是沒有在計算機內執行,當前沒有執行。 node

進程:計算機正在執行的程序 面試

守護進程:一直運行的程序 shell

【精簡開機啓動操做】 數據庫

[root@Songge ~]# chkconfig --list |grep '3:on' vim

crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off 緩存

network 0:off 1:off 2:on 3:on 4:on 5:on 6:off 安全

rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off

sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

sysstat 0:off 1:on 2:on 3:on 4:on 5:on 6:off

4.1.2 定時任務存在的意義

數據庫或者代碼程序,須要晚上0點作一次全備,天天執行週期性的工做,咱們就須要Linux系統的定時任務crond,實時備份,定時備份,時間同步。

4.1.3 Linux系統crond 的定時任務

* Linux 系統自身按期執行的任務工做,如輪詢系統日誌,備份系統數據,清理系統緩存。這些任務無需咱們人爲干預。

[root@Songge ~]# ls -l /var/log/messages*

-rw------- 1 root root 485799 May 30 22:28 /var/log/messages

-rw-------. 1 root root 594171 May 4 13:12 /var/log/messages-20160504

-rw------- 1 root root 494732 May 19 21:25 /var/log/messages-20160519

-rw------- 1 root root 391369 May 22 14:42 /var/log/messages-20160522

-rw------- 1 root root 1177379 May 29 07:03 /var/log/messages-20160529

[root@oldboyedu data]# ll /var/log/secure*

-rw------- 1 root root 18731 May 28 21:56 /var/log/secure

-rw-------. 1 root root 7075 May 4 13:13 /var/log/secure-20160504

-rw------- 1 root root 7745 May 19 20:36 /var/log/secure-20160519

-rw------- 1 root root 4905 May 22 14:45 /var/log/secure-20160522

[root@Songge logrotate.d]# cd /etc/logrotate.d;ll

total 16

-rw-r--r--. 1 root root 139 Jul 24 2015 dracut

-rw-r--r--. 1 root root 329 Jul 17 2012 psacct

-rw-r--r--. 1 root root 210 Dec 10 2014 syslog

-rw-r--r--. 1 root root 87 Jul 24 2015 yum

查看系統自帶任務內容 syslog

[root@Songge logrotate.d]# cat 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

}

本身添加時間同步任務:

[root@oldboyedu data]# crontab -l

#time sync by oldboy at 2010-2-1

*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1

Linux系統下定時任務的命令 有crontab at anacron

crontab 能夠週期性的執行任務工做

at 適合執行一次就結束的調度任務命令

anacron 適用於非7*24小時開機服務器準備的。

提示:1. crond 服務是運行的程序

contab 命令用戶用來設置定時規則的命令

2. crond 服務是企業生產工做中經常使用的重要服務,at 和 anacron不多使用。

3.幾乎每一個服務器都會用到crond 服務

4.2 定時任務crond 使用說明

命令crontab -l 羅列編輯任務信息

-e 編輯定時任務

*經過查看系統下日誌,發現不少任務都是自帶時間格式

[root@Songge ~]# cd /var/log;ls

anaconda.ifcfg.log maillog-20160522

anaconda.log maillog-20160529

anaconda.program.log messages

anaconda.storage.log messages-20160504

anaconda.syslog messages-20160519

anaconda.xlog messages-20160522

anaconda.yum.log messages-20160529

同理查看系統的任務日誌

[root@Songge log]# ll -h cron*

-rw------- 1 root root 51K May 31 10:30 cron

-rw-------. 1 root root 8.7K May 4 13:44 cron-20160504

-rw------- 1 root root 13K May 19 21:26 cron-20160519

-rw------- 1 root root 51K May 22 15:45 cron-20160522

-rw------- 1 root root 147K May 29 08:09 cron-20160529

查看系統的天天 每日 每個月 任務日誌

[root@Songge log]# ls -l /etc/|grep cron

-rw-------. 1 root root 541 Mar 30 2015 anacrontab

drwxr-xr-x. 2 root root 4096 Apr 21 12:35 cron.d

drwxr-xr-x. 2 root root 4096 Apr 21 12:35 cron.daily

-rw-------. 1 root root 0 Mar 30 2015 cron.deny

drwxr-xr-x. 2 root root 4096 Apr 21 12:34 cron.hourly

drwxr-xr-x. 2 root root 4096 Apr 21 12:35 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

查找以上文件所處路徑

[root@Songge log]# find / -type f -name "cron.weekly"

/var/spool/anacron/cron.weekly

[root@Songge log]# find / -type f -name "crontab"

/etc/crontab

/usr/bin/crontab

[root@Songge log]# find / -type f -name "anacrontab"

/etc/anacrontab

#有的備註在etc 配置文件裏

[root@Songge log]# ls -hild /usr/bin/crontab

18291 -rwsr-xr-x. 1 root root 51K Mar 30 2015 /usr/bin/crontab

#suid

[root@Songge log]# ls -hild /etc/crontab

142740 -rw-r--r--. 1 root root 457 Sep 27 2011 /etc/crontab

anacrontab就是系統計劃任務的擴展文件:在一個指定時間間隔錯事後自動執行任務 這個是系統設置好了,清理系統垃圾或者是自動執行某些腳本的系統任務,不要更改 配置文件是/etc/anaconrtab

[root@Songge log]# cat /etc/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

日誌切割(系統切割的配置文件,裏邊內容會調用腳本)

[root@Songge log]# 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

}

4.2.1 指令語法

crontab 【-u user(爲哪一個用戶)】 {-e |-l|-r}

#以上爲系統的定時任務,須要添加用戶

咱們自帶的定時任務不須要用戶

4.2.2 指令說明

* * * * * * 分時日月周 crond 服務經過crontab 命令實現

4.2.3 經常使用的幾個配置文件

/etc/cron.deny 文件中所列用戶禁止使用crontab命令#經過vi編輯,而後在文本中直接輸入普通用戶

/etc/cron.allow 所列用戶容許使用crontab命令,優先於/etc/cron.deny

/var/spool/cron/ 全部用戶crontab配置文件默認存放此目錄,文件名以用戶名命名

[root@Songge log]# cat /var/spool/cron/root

#time sync by oldboy at 2010-2-1

*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1

##### 練習

#*/1 * * * * echo syy >>/server/log/oldboy.log

### 每一個一分鐘,打印一個+號到oldboy.log

#* * * * * echo 'syy' >> /server/scripts/oldboy.log

### 打包任務

#00 */2 * * * tar zcvf /data/www/html.tar.gz /var/www/html

#####send qingshu mail

#* * * * * /bin/sh /server/scripts/send_qingshu.sh>/dev/null 2>&1

以上兩種結果同樣,crontab 讀取的是/var/spool/cron/ 用戶(root)的信息。

crontab 爲何不直接在/var/spool/cron/路徑編輯?

1.有語法檢查功能 2.輸入便捷

4.2.4 指令說明

crontab -e 編輯

crontab -l 羅列信息

4.2.5 定時任務指令使用格式

定時任務的格式分爲6個段

* * * * * cmd

image

 

注意小結:

1.依次對應分時日月周

2.每一個*號之間至少一個空格

3. cmd 爲要執行的命令或者腳本 例如經常使用:

/bin/sh /server/scripts/oldboy.sh

4. root 用戶定時任務配置文件爲 /var/spool/cron/root

crontab 特殊符號含義解釋:

* 表示 每 意思

, 表示單個列出時間

- 表示從 到 的意思

/n 表示每隔n的意思

4.2.6 crontab 編輯定時任務依賴的服務

[root@Songge log]# chkconfig --list crond

crond 0:off 1:off 2:on 3:on 4:on 5:on6:off

[root@Songge /]# /etc/init.d/crond status

crond (pid 1257) is running...

[root@Songge /]# ps -ef |grep crond

root 1257 1 0 10:28 ? 00:00:00 crond

root 1715 1311 0 11:54 pts/0 00:00:00 grep --color=auto crond

[root@Songge /]# ps -ef |grep crond|grep -v grep

root 1257 1 0 10:28 ? 00:00:00 crond

#以上的gerp –v 是不顯示 grep(做爲名稱) 內容

[root@Songge /]# /etc/init.d/crond restart

Stopping crond: [ OK ]

Starting crond: [ OK ]

4.2.7 查看幾個例子

①30 3,12 * * *

②30 */6 * * *

③30 8-18/2 * * *

④30 21 * * *

⑤45 4 1,10,22 * *

⑥ 10 1 * * 6,0

⑦0,30 18-23 * * *

如下方式表示不規範

* 23,00-07/1 * * *

以上任務表示在晚上11點到第二天7點 每分鐘都要執行任務

※ 周和日儘可能不要同時用,不然可能達不到想要的結果

4.3 生產環境crontab 專業實例

例題:4.3.1 每分鐘 打印一次本身的名字拼音到「/server/log 本身的名字命名的文件」中。

mkdir -p /server/log

touch /server/log/syy.log

[root@Songge /]# crontab –e

### 每隔一分鐘,打印本身姓名到syy.log

* * * * * echo 'syy' >> /server/log/syy.log

[root@Songge log]# tail -f syy.log

syy

syy

syy

【解答知識小結】

※ 定時任務加註釋

※ 定時任務 儘可能不要在同一行出現兩個命令

※此例題不能接入 >/dev/null 2>&1,不然不能出現結果。

※ /server/log 目錄存在才能出結果

※ 定時任務必須的路徑必定要絕對路徑。

※ crond 服務必需要開啓

※ 查看定時任務日誌: tail /var/log/cron

例題:4.3.2 每週六 週日 9:00 和14:00 來老男孩Linux 培訓學習(執行/server/scripts/ oldboy.sh)要求:此腳本的功能是打印當天的日期。

mkdir /server/scripts/ -p

echo ‘date +%F’ >> /server/scripts/oldboy.sh

crontab -e

00 9,14 * * 6,7 bin/sh /server/scripts/oldboy.sh

sh /server/scripts/oldboy.sh

【補充】

bash 格式 #! /bin/bash

history 查詢歷史命令

給文本加上權限 chmod +x 文件,而後用./文件名 就能夠執行

【******】

[root@Songge ~]# cd /var/spool/postfix/maildrop

#以上路徑爲 郵箱發送失敗後的郵件存儲地。

[root@Songge server]# ls /var/spool/postfix/maildrop/

17FDE3F6BC B9F183F6A5 E2AA23F6BA

小結:

以上是錯誤的郵件信息

情形模擬:當此前的目錄文件太多時,消耗掉inode ,

措施:給定時任務加>/dev/null 2>&1或者 定時任務加個任務 (sh oldboy.sh >>/dev/null 2>&1)

4.4書寫定時任務規範要領:

爲定時任務規則加必要的註釋

執行shell 腳本任務前加 /bin/sh

定時任務命令或腳本結尾加

>/dev/null 2>&1【經常使用】

1>/dev/null 2>/dev/null

&>/dev/null

錯誤的寫法
/bin/sh /server/scripts/oldboy.sh  >>/server/file/zhangyao &>/dev/null
正確的寫法
[root@oldboyedu scripts]# cat oldboy.sh
#! /bin/bash
date +%F >>/server/log/zhangyao
* * * * * /bin/sh /server/scripts/oldboy.sh >/dev/null 2>&1

查看郵箱服務狀態:

[root@Songge maildrop]# /etc/init.d/postfix status

master is stopped

郵箱開啓

[root@Songge maildrop]# /etc/init.d/postfix start

郵箱關閉(通常經常使用設置)

[root@Songge maildrop]# /etc/init.d/postfix stop

若是郵箱服務開啓,

或者將執行的命令定向到一個文本

或者定向到黑洞

則在/etc/init.d/postfix/maildrop 下面不會生成大量垃圾文件

案例:若是maildrop下面的文件太多,用rm直接刪除會出現如下錯誤提示:Argument list too lon

解決方案:

1. 標準刪除 ls|xargs rm -f

2. 方法將MAILTO=root的root去掉

[root@Songge ~]# vi /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

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

"/etc/crontab" 16L, 457C

定時任務命令超過兩條的,最好寫到腳本里執行

如下寫法不專業

* * * * * sleep 1;echo oldboy >> /server/log/oldboy.log

標準寫法:

cat /server/log/oldboy.log

sleep 1

echo oldboy >> /server/log/oldboy.log

在指定用戶下執行相關的定時任務

*要注意不一樣用戶環境變量的問題

生產任務程序不要隨意打印輸出信息

tar zcvf echo 123 >a.log

例 下面是定時任務調用的腳本:

cat /server/scripts/tar.sh

tar zcf /server/scripts/backup_$(date +%F-%H-%M).tar.gz //server/scripts

定時任務執行的腳本要規範路徑(/server/scripts)

配置定時任務規範操做過程

首先在命令行操做成功,而後複製成功的命令到腳本里。

2)而後測試腳本,測試成功後,複製腳本的規範路徑到定時任務配置裏

3)先手動測試,在放到正式環境部署

4.5 系統定時任務配置/etc/crontab

[root@oldboyedu ~]# ll /var/log/messages*

-rw------- 1 root root 1157016 Jun 2 09:40 /var/log/messages

-rw-------. 1 root root 594171 May 4 13:12 /var/log/messages-20160504

-rw------- 1 root root 494732 May 19 21:25 /var/log/messages-20160519

-rw------- 1 root root 391369 May 22 14:42 /var/log/messages-20160522

-rw------- 1 root root 1177379 May 29 07:03 /var/log/messages-20160529

#該文件夾的文件數不超過5個,只保留最新的5個

[root@oldboyedu ~]# cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

shell 指 在那個環境下執行命令

path 環境變量

home 系統定時任務默認目錄-家目錄

咱們建立的定時任務存放在 /var/spool/cron/

root@Songge cron]# tailf /var/log/cron 查看定時任務的日誌

企業生產場景如何調試crontab 定時任務

4.6.1 增長執行任務頻繁調試任務(某些任務不能用於生產環境)

強調:有些計劃任務是不容許頻繁執行的,例如:定時往數據庫裏插入數據,這樣的任務就要在測試機上測試好,而後部署到正式線上,這樣正式工做出現的問題就會不多了

4.6.2 調整系統時間調試任務(不能用於生產環境)

能夠修該下系統當前時間

4.6.3 經過腳本日誌輸出調試定時任務

[root@oldboyedu ~]# crontab –e

# study task by oldboy at 20160602

00 9,14 * * 6,0 /bin/sh /server/scripts/oldboy.sh >/app/log.log 2>&1

腳本里輸出 vim /oldboy.sh

cd /

tar zcvf /tmp/etc_$(date +%Y%m%d).tar.gz ./etc/tmp.log 2>&1

4.6.4 注意一些命令帶來的問題

※ * * * * * echo 「==」 >> /tmp/oldboy.log >/dev/null 2>&1

以上是沒法執行的任務配置,由於前面多了>> ,只能有一個重定向符號。要去掉後面的>/dev/null 2>&1

4.6.5 注意環境變量致使的定時任務故障

在調試java程序任務的時候,注意環境變量,把環境變量的定義加到腳本里

格式:export JAVA_HOME=/application/jdk1.6

export PATH=$JAVA_HOME/bin:$PATH

[root@oldboyedu ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

4.6.6 經過crond 定時任務服務日誌調試定時任務

[root@oldboyedu ~]# ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}' 10.0.0.8

[root@oldboyedu ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@oldboyedu ~]# cd /server/scripts/

[root@oldboyedu scripts]# vim iptest.sh

#!/bin/bash

IP=$(ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}')

echo ${IP}_a123 >> /tmp/iptest.txt

[root@oldboyedu scripts]# sh iptest.sh

[root@oldboyedu scripts]# vim iptest.sh

#!/bin/bash

source /etc/profile

IP=$(ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}')

echo ${PATH}_${IP}_a123 >> /tmp/iptest.txt

另開窗口1:

[root@oldboyedu ~]# cd /tmp;ls

[root@oldboyedu tmp]# touch iptest.txt

[root@oldboyedu tmp]# tailf /tmp/iptest.txt

[root@oldboyedu tmp]# cat iptest.txt

10.0.0.8_a123

小結:

緣由:用戶的定時任務的環境變量爲/usr/bin:/bin

1. 腳本中全部的命令都使用全路徑

2. 自定義path路徑

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

3.source /etc/profile

4.7 crontab 定時任務生產應用問題注意

1.系統環境變量問題

2.定時任務要用絕對路徑

※若是用相對路徑,則會建立在 該用戶的家目錄下面

# test

* * * * * echo + > oldboy.log

3.定時任務的腳本權限問題 最好帶上/bin/sh

4. 時間變量問題用反斜線 \ 轉義

crontab 任務命令中,若是有「date +%Y%m%d」,必須替換爲「date +\%Y\%m\%d」但寫在腳本文件裏,就不需轉義。

5. >/dev/null 2>&1

或者 (1>/dev/null 2>/dev/null) 或者(&>/dev/null)

當定時任務在你指定的時間執行後,系統會寄一封信給你,顯示該程式執行的內容,若系統未開啓郵件服務就會致使郵件臨時目錄/var/spool/clientmqueue 小文件逐漸增多,以致於大量消耗inode數量,其實在每一行任務結尾空一格以後加上 >/dev/null 2>&1 將輸出定向爲空 來規避這個問題

若是須要打印日誌輸出,也能夠追加到制定的日誌文件裏。儘可能不要留空。

6. 定時任務以前加註釋

7. 使用腳本程序代替命令行定時任務

8.避免沒必要要的程序以及命令輸出 如tar zcvf 的v

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

4.8 crontab 生產問題及解決過程

面試題 : 在系統維護的時候,建立文件提示:No space left on device磁盤沒有空間可寫,請問這是什麼故障?

解答: 磁盤空間block 滿了或者inode滿了 ,用df –h 或者df –i

查看

4.8.1 No space left on device 故障1

措施: 菜單/var/spool/clientmqueue && ls |xargs rm -f

亡羊補牢解決辦法:

儘可能將crontab 裏面的命令或腳本中的命令結尾加上

/dev/null 2>&1

啓郵件服務,不過最好不作,由於郵件服務會帶來安全問題。

優化系統,加定時清理任務,如 find /var/spool/clientmqueue/ -type f -mtime +30|xargs rm -f 放入到定時任務,每週處理一次

4.8.2 No space left on device 故障2

令passwd報錯因inode節點處理記錄
故障現象:
      一、修改密碼時報錯 passwd: Authentication token manipulation error
      二、添加用戶報錯:unable to lock password file
分析問題:
  一、檢查相關配置文件權限正常:
  /etc/passwd
  /etc/shadow
google的解決方法嘗試沒能解決問題,df查看硬盤空間正常:

image

  二、使用命令strace -f passwd 追蹤分析緣由,看到關鍵報錯信息:「No space left on device」,但是df查看硬盤空間沒問題呀,google得知有多是inode滿了查看的確是根分區inode滿了

image

查找緣由:
    /var/spool/clientmqueue 生成的文件佔用完inode,此目錄下文件的產生緣由主要是crontab裏面的命令沒有添加「>/dev/null 2>&1」標準輸出、錯誤輸出信息都輸入到/dev/null,

解決方法:
   一、刪除文件後正常,目錄下文件太多建議使用管道加xargs:
   ls /var/spool/clientmqueue |xargs rm -rf   #由於目錄下都是文件最好使用

image

二、將crontab命令後面添加「>/dev/null 2>&1」

小結:

1) inode知識

2) crontab任務寫法

3/var/spool/clientmqueue 功能和潛在問題。

4strace跟蹤命令

4.9 crond 章節重點

4.10常見報錯註釋

1. command not found 命令沒有找到

2. No such file or directory 沒有這個文件或目錄

3. Permission denied 權限不足

4. No space left on device 磁盤沒有剩餘空間

5. File exists 文件已經存在

6. Is a directory 這是1個目錄

7. Not a directory 不是1個目錄

8. Warning: Changing a readonly file 警告:改變一個只讀文件

9. Found a swap file by the name ".1.swp" vim編輯器碰到的意外關閉文件有緩存文件

10. unrecognized option '--aaa' 未知參數,去查看幫助

11. Connection timed out

12. Connection refused

4.11 crontab 書寫規範邏輯圖

定時任務書寫規範邏輯結構圖1

4.12 Linux郵件發送情書 邏輯結構圖

image

【補充】定時任務的平常rc.d不能直接打包 (它是一個軟鏈接),須要使用原路徑

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息