c定時 linux專題及常見問題 - CSDN

2021-01-08 CSDN技術社區
1.定時任務介紹

1.1 crond是什麼

crond是linux系統中用來定期執行命令或指定程序的一種服務或軟體。

特殊要求:(秒級別)crond服務就無法搞定了,一般工作中寫腳本用守護進程執行

[root@shellbiancheng jiaobenlianxi]# cat while1.sh #!/bin/shwhile true do uptime sleep 2 done

1.2 linux系統crond的定時任務

(1)linux系統自身定期執行的任務操作,如輪詢系統日誌、備份系統數據、清理系統緩存等,這些任務無需我們人為幹預。例如:

[root@linzhongniao ~]# ls -l /var/log/messages* -rw--. 1 root root 206776 Aug 2 17:43 /var/log/messages -rw--. 1 root root 448307 Jul 8 08:54 /var/log/messages-20180708 -rw--. 1 root root 742560 Jul 16 04:05 /var/log/messages-20180716 -rw--. 1 root root 1293433 Jul 22 15:15 /var/log/messages-20180722 -rw--. 1 root root 622193 Jul 30 20:14 /var/log/messages-20180730[root@linzhongniao ~]# ll /etc/|grep cron -rw--. 1 root root541 Aug 24 2016 anacrontabdrwxr-xr-x. 2 root root 4096 Jul 16 14:19 cron.ddrwxr-xr-x. 2 root root 4096 Jul 16 14:18 cron.daily -rw--. 1 root root 0 Aug 24 2016 cron.denydrwxr-xr-x. 2 root root 4096 Jul 16 14:19 cron.hourlydrwxr-xr-x. 2 root root 4096 Jun 14 05:01 cron.monthly -rw-r--r--. 1 root root457 Sep 27 2011 crontabdrwxr-xr-x. 2 root root 4096 Sep 27 2011 cron.weekly

2)用戶執行的任務操作:某個用戶或系統管理員定期要做的任務工作,例如每隔5分鐘和網際網路上時間伺服器進行同步,每天晚上0點備份站點數據及資料庫數據,一般這些工作需要由每個用戶自行設置才行。

用戶執行的任務工作,也就是運維管理員執行的任務工作,因此這個用戶執行的任務是我們的重點。

1.3 linux系統下定時任務軟體種類

linux系統下的定時任務還真不少,例如:at,crontab,anacron

at:適合僅執行一次就結束的調度任務命令,例如:某天晚上需要處理一個任務,僅僅是這一天的晚上,屬於突發性任務,要執行at命令,還需要啟動atd的服務才行

[root@linzhongniao ~]# chkconfig --list|grep atdatd 0:off 1:off 2:off 3:off 4:off 5:off 6:off[root@linzhongniao ~]# chkconfig --list atdatd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

2.定時任務使用說明

[root@linzhongniao ~]# crontab --helpcrontab: invalid option -- '-'crontab: usage error: unrecognized optionusage: crontab [-u user] filecrontab [-u user] [ -e | -l | -r ] 《==指令語法(default operation is replace, per 1003.2) -e (edit user's crontab) 《==編輯用戶的定時任務 -l (list user's crontab) 《==列出用戶的定時任務 -r (delete user's crontab) 《==刪除用戶的定時任務 -i (prompt before deleting user's crontab) 《==在刪除用戶的crontab之前提示 -s (selinux context)

命令格式

crontab –u (指定用戶默認是root)-[e|l|r]

2.1 指令說明

通過crontab我們可以在固定的時間執行指定的系統指令或script腳本。時間間隔的單位是分鐘,小時,日,月,周及以上的任意組合(注意:日和周不要組合)。

2.2 使用者權限及定時任務文件

2.3 指令選項說明表

2.4 指令的使用格式

用戶所建立的crontab文件存於/var/spool/cron中如:root用戶的定時任務配置文件為/var/spool/cron/root。

crontab用戶的定時任務一般分為6段空格分隔。系統的定時任務則/etc/crontab分為7段,前5段為時間設定段,第六段以哪個用戶執行crontab,第七段為所要執行的命令段如下

01 * * * * root run-parts /etc/cron.hourly02 4 * * * root run-parts /etc/cron.daily22 4 * * 0 root run-parts /etc/cron.weekly42 4 1 * * root run-parts /etc/cron.monthly

系統的crontab文件是/etc/crontab

[root@linzhongniao ~]# cat /etc/crontab SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/# 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 分 時 日 月 周 用戶 任務

2.5 crontab語法格式中時間段得含義

提示:最後一次執行任務的時間是23:30

2.6 crontab語法格式中特殊符號含義

2.7 開啟定時任務服務

[root@linzhongniao ~]# chkconfig --list crondcrond 0:off 1:off 2:on3:on4:on5:on6:off[root@linzhongniao ~]# /etc/init.d/crond statuscrond (pid 1837) is running...[root@linzhongniao ~]# ps -ef|grep crond|grep -v greproot 1837 1 0 21:58 ?00:00:00 crond[root@linzhongniao ~]# /etc/init.d/crond restartStopping crond: [ OK ]Starting crond:[ OK ]

2.8 編輯定時任務注意事項

(1)編輯定時任務分鐘位上必須用00格式表示

例如,6月3日上午9:00去培訓,規則為

00 09 03 06 *

(2)周和日不能同時使用

強調周和日儘量不要同時用,否則可能達不到想要的效果

例如:

每周日上午9:30去上課

30 09 * * 7或者 30 09 * * 0

2.9 伺服器時間同步

(1)手動同步時間

[root@linzhongniao ~]# dateSat Aug 4 12:08:20 CST 2018[root@linzhongniao ~]# date -s "23:00"Sat Aug 4 23:00:00 CST 2018[root@linzhongniao ~]# dateSat Aug 4 23:00:03 CST 2018[root@linzhongniao ~]# which ntpdate/usr/sbin/ntpdate[root@linzhongniao ~]# /usr/sbin/ntpdate ntp1.aliyun.com 4 Aug 12:10:21 ntpdate[1700]: step time server 52.163.118.68 offset -39052.961525 sec[root@linzhongniao ~]# dateSat Aug 4 12:10:30 CST 2018

(2)用定時任務自動同步

[root@linzhongniao ~]# crontab -l#sync sys time by linzhongniao at 2018-08-04 */2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1[root@linzhongniao ~]# /etc/init.d/crond restartStopping crond: [ OK ]Starting crond:[ OK ][root@linzhongniao ~]# date -s "23:00"Sat Aug 4 23:00:00 CST 2018[root@linzhongniao ~]# dateSat Aug 4 23:00:06 CST 2018[root@linzhongniao ~]# dateSat Aug 4 12:21:53 CST 2018

機器少還可以和網際網路上時間同步,如果有很多伺服器,可以搭建一個內部的時間同步伺服器ntp server。

提示:如果不加「>/dev/null 2>&1」會因產生垃圾文件導致磁碟inode耗盡的問題。

3.生產環境crontab專業案例

每天晚上12點打包站點目錄/var/www/html備份到/data目錄下(最好每次按時間生成不同的備份包)

[root@linzhongniao scripts]# cat httpd.sh#!/bin/bashcd /var/www/tar zcfp /data/html_$(date +%Y%m%d%H%M).tar.gz ./html[root@linzhongniao scripts]# crontab -l|tail -2#tar /var/www/html by shell scripts by linzhongniao at 20180800 00 * * * /bin/bash /server/scripts/httpd.sh >/dev/null 2>&1

4.書寫定時任務5個基本要領

4.1 為定時任務規則加必要的注釋

加必要注釋,寫定時任務規則時儘可能加上注釋(最好是英文注釋),這是個好的習慣。

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

執行定時任務時,如果是執行腳本,請儘量在腳本前面加上/bin/sh命令,否則有可能忘了給腳本加執行權限,而無法完成任務。

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

需要root權限執行的任務可以登錄到root用戶下然後設置,如果不需要root權限,可以登錄到普通用戶下(也可以直接在root下crontab –u linzhongniao –e的寫法直接設置)

切換到linzhongniao用戶

[linzhongniao@linzhongniao ~]$ whoamilinzhongniao[linzhongniao@linzhongniao ~]$ crontab -l* * * * * /bin/sh tar.sh

不切換用戶直接查看定時任務

[root@linzhongniao ~]# crontab -u linzhongniao -l* * * * * /bin/sh tar.sh

看一下crond用戶的配置文件

[root@linzhongniao ~]# ll /var/spool/cron/total 8 -rw--. 1 root root 25 Aug 4 14:25 linzhongniao -rw--. 1 root root 222 Aug 4 2018 root

平時工作中儘量多用crontab –e和crontab –l去編輯和查看定時任務,因為會有語法錯誤檢查。

如果給1000臺伺服器同時添加系統時間實時同步,不可能一個一個改,此時就需要批量分發工具或批量運維腳本。

4.4 定時任務結尾加>/dev/null 2>&1

/dev/null是特殊的設備,表示黑洞設備或空設備;2>&1表示標準錯誤輸出和標準輸出的輸出的路徑都一樣。>/dev/null 2>&1相當於1>/dev/null,2>/dev/null

5.系統定時任務配置文件/etc/crontab

系統定時任務分七段,如果某一臺伺服器上的用crontab –l查看沒有定時任務,就上系統定時任務裡面用cat查看。

[root@linzhongniao ~]# cat /etc/crontab SHELL=/bin/bash shell解釋器PATH=/sbin:/bin:/usr/sbin:/usr/bin PATH變量MAILTO=root 定義如果任務有輸出,發給哪個用戶默認是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 分 時 日 月 周 用戶 腳本

通過run-parts使得系統可以定時執行目錄下的所有可執行文件

按周執行的配置文件

[root@linzhongniao ~]# tree /etc/cron.weekly/etc/cron.weekly0 directories, 0 files

按天執行的配置文件

[root@linzhongniao ~]# ll /etc/cron.daily/total 24 -rwx-. 1 root root 180 Jul 10 2003 logrotate -rwx-. 1 root root 927 Mar 22 2017 makewhatis.cron -rwx-. 1 root root 189 Jan 26 2015 mlocate.cron -rwxr-xr-x. 1 root root 2126 Jul 19 2013 prelink -rwxr-xr-x. 1 root root 563 Nov 23 2013 readahead.cron -rwxr-xr-x. 1 root root 433 Nov 7 2015 tmpwatch

6.生產場景如何調試crontab定時任務

6.1 增加執行頻率調試任務

在調試時,把任務執行頻率調快一些。如:每分鐘、每5分鐘執行一次,或者比當前時間推遲5分鐘以後或者每2鍾執行。按己想像的去執行了,如果沒問題再改成需要的任務執行的時間。

強調:有些任務是不允許頻繁執行的,例如:定時往資料庫裡插入數據,這樣的任務在測試機上測試好,然後正式線上出現問題的機會就少了。

6.2 調整系統時間調適任務

用正確的執行任務的時間。設置完成後,可以修改下當前時間,改成任務執行時間的前幾分鐘來測試(或者重啟定時任務服務)如:定時任務9:00執行,我們可以把系統時間改成8:55分,然後觀察是不是正確執行了,當前時間要比任務時間提前足夠長,只在測試伺服器上操作,如果生產伺服器不要這樣處理。

6.3 通過日誌輸出調試定時任務

在腳本中加入日誌輸出,然後把輸出打到指定的日誌中,然後觀察日誌內容結果。看是否執行或正確執行,或向下面的內容把腳本結果重定向到一個log文件裡。比如 tar zcvf命令加-v參數,在把輸出放到日誌裡面,通過日誌就可以查看腳本有沒有執行。

*/2 * * * * /usr/sbin/ntpdate time.windows.com >>/app/ntpdate.log

6.4 注意一些任務執行帶來的問題

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

這是隱蔽的無法執行的任務配置,原因是前面多了一個>>/tmp/oldboy.log,或者去掉>/dev/null 2>&1。

6.5 注意環境變量導致的定時任務故障

在調試java程序的時候,注意環境變量,要把環境變量的定義追加到腳本裡,重新export一下。一般都放在全局變量/etc/profile裡面,但是用定時任務執行腳本還需要重新加載一下環境變量。

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

6.6 通過定時任務日誌/var/log/cron調試定時任務

[root@linzhongniao app]# tail -f /var/log/cronAug 5 11:01:01 localhost run-parts(/etc/cron.hourly)[2054]: starting 0anacronAug 5 11:01:02 localhost anacron[2068]: Anacron started on 2018-08-05Aug 5 11:01:02 localhost run-parts(/etc/cron.hourly)[2070]: finished 0anacronAug 5 11:01:02 localhost anacron[2068]: Will run job `cron.daily' in 34 min.Aug 5 11:01:02 localhost anacron[2068]: Jobs will be executed sequentiallyAug 5 11:02:01 localhost CROND[2075]: (root) CMD (/usr/sbin/ntpdate time.windows.com >/app/ntpdate.log)

7.生產定時任務注意事項

7.1 export變量問題

crontab執行shell時只能識別不多的系統環境變量,普通變量是無法識別的。如果在編寫的腳本中需要使用變量,最好使用export重新聲明一下該變量,腳本才能正常執行。例如生產中和java相關的服務任務和腳本。也可以在腳本中添加PATH環境變量加完PATH環境變量就不用寫執行命令全路徑了。例如下面的/bin/tar,就可以不寫了。

[root@linzhongniao ~]# cat /server/scripts/tar.sh#!/bin/bashexport PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"cd /server//bin/tar zcf backup_$(date +%Y%m%d%H%M).tar.gz ./scripts

7.2 任務路徑問題

一定要用絕對路徑不要用相對路徑。推薦定時執行腳本。

7.3 腳本權限問題

要加/bin/sh執行,也可以不在定時任務中用/bin/sh就要給腳本可執行權限。

7.4 時間變量問題

「%」百分號在crontab任務中認為是newline,需要用「」轉義。crontab任務命令中,如果有「date +%Y%m%d%H%M」(或date +%Y-%m-%d-%H:%M),必須替換為「date +%Y%m%d%H%M」,但寫在腳本中的「%」百分號就不需要轉義了。

7.5 定時任務加注釋

寫定時任務要加上注釋如:什麼人,什麼時間,因為誰,做了什麼事都要標記清楚如誰與2018-08-01日在http伺服器上做了10分鐘同步的操作。

7.6 使用腳本程序替代命令

使用腳本執行任務可以減少錯誤,提升效率,規範,是個好習慣。

7.7 定時任務腳本的問題

定時任務腳本中的程序命令儘量用全路徑。

8.生產環境定時任務重現生產no space left

企業inode被填滿的企業案例

問題:修改用戶密碼和添加用戶時出現下面錯誤,但是用df –h發現磁碟沒滿,請問為什麼?

1、修改密碼時報錯 passwd: Authentication token manipulation error 2、添加用戶報錯:unable to lock password file

分析思路:查看/etc/passwd和/etc/shadow的文件權限沒有問題,再使用命令strace -f passwd 追蹤分析原因,看到關鍵報錯信息:「No space left on device」。最後用df -hi查看發現根分區的inode滿了。

解決辦法:

(1 打開郵件服務,打開郵件服務就把郵件目錄清空了不要直接刪除文件,生產環境郵件服務是不開的。

(2 在定時任務最後加>/dev/null 2>&1將輸出內容定義到空。這樣就不會產生垃圾文件了。

轉載地址:https://blog.51cto.com/10642812/2280981

博客作者海風掠過的原創作品

相關焦點

  • linux資料庫是否啟動專題及常見問題 - CSDN
    檢查資料庫是否啟動,linux下可以用ipcs查看,windows下可以查看服務、也可以進到資料庫裡面看資料庫當前狀態 select status from v$instance;如果status = open 就說明oracle服務正常。查看監聽,執行lsnrctl status,就可以看監聽所對應的實例。
  • c++信號與槽專題及常見問題 - CSDN
    開源庫下載:包含說明文檔,源碼,實例:https://download.csdn.net/download/u012372584/131624962、直接編譯會有錯誤,需要對源碼中的一句進行更改:將第419行 :typedef sender_set::const_iterator const_iterator; 更改為:typedef typename sender_set
  • github覆蓋本地專題及常見問題 - CSDN
    參考文獻[1] Github進行fork後如何與原倉庫同步 https://blog.csdn.net/matrix_google/article/details/80676034[2] git分支查看及切換 https://blog.csdn.net/qq_26710805/article/details/80674006[3] git 放棄本地修改
  • C語言定時關機程序,一言不合就分享!「源碼」
    寫一個定時關機的小程序,可以立即關閉計算機,也可以一段時間後關閉計算機。這裡主要考察system()命令。cols=48 lines=25");  //窗口寬度高度     system("color f0");  //可以寫成 red 調出顏色組    system("date /T");    system("TIME /T");    printf("- C語言關機程序 -\n");    printf("1.實現10分鐘內的定時關閉計算機
  • 嵌入式學習筆記(2)--scanf使用常見問題及解決方法
    是我們學到的第一個函數,相信「hello world」這個例子大家都不會陌生吧,接著就是scanf()這個函數了,這個函數的功能是格式輸入,它的函數原型是:本文引用地址:http://www.eepw.com.cn/article/148534.htmint scanf(cONST char *format,…);這個函數的基本用法這裡就不說了,這裡介紹一些這個函數使用中常見的問題及
  • 剖析C語言中a=a+++a的無聊問題
    同僚們閒聊,突然就聊到了a+++++a的問題。這種純屬C語言 「二」 級的問題應該是從a+++a引申出來的吧。於是乎兄弟姐妹們開始討論它的運算結果,以及改如何理解。
  • Linux下C應用程式開發
    例如, 下面的兩個命令是不同的:    gcc -p -g test.c  gcc -pg test.c  第一條命令告訴 GCC 編譯 test.c 時為 prof 命令建立剖析(profile)信息並且把調試信息加入到可執行的文件裡. 第二條命令只告訴 GCC 為 gprof 命令建立剖析信息.
  • eviews的線性回歸專題及常見問題 - CSDN
    同時藉此實驗達到如下目的:• 熟悉建立多元線性回歸模型解決實際問題的過程;• 掌握多元線性回歸模型的基本思想和操作;• 鞏固所學,加深對課程內容的理解。(數據說明:數據取自國家統計局,系2016年的數據。
  • PHP在Linux下執行定時任務的實現思路詳解
    而Linux中,使用命令行,用CronTab來定時任務,又是絕佳的選擇,而且也是效率最高的選擇。首先,進入命令行模式。作為伺服器的linux一般都默認進入命令行模式的,當然,我們管理伺服器也一般通過putty等工具遠程連接到伺服器,為了方便,我們用root用戶登錄。
  • linux 桌面無法啟動專題及常見問題 - CSDN
    歡迎提出問題和建議。via: https://itsfoss.com/add-multiple-time-zones-ubuntu/作者:Abhishek Prakash 選題:lujun9972 譯者:geekpi 校對:wxy本文由 LCTT 原創編譯,Linux中國 榮譽推出
  • f檢驗 matlab專題及常見問題 - CSDN
    15.71985 15.91986 15.71987 16.71988 15.31989 16.11990 16.2MATLAB實現參考網上多個代碼可得https://www.ilovematlab.cn/thread-246993-1-1.htmlhttps://blog.csdn.net
  • android tv放大專題及常見問題 - CSDN
    ,R.drawable.h ,R.drawable.i,R.drawable.j,R.drawable.x,R.drawable.y,R.drawable.r,R.drawable.w,R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e,R.drawable.f,R.drawable.g,R.drawable.h
  • oracle sql 布爾值專題及常見問題 - CSDN
    id=1 and 1=(select decode(substr((select username%7c%7cpassword from admin),1,1),'a',1,0) from dual)id=1 and 1=(select decode(substr((select username%7c%7cpassword from admin),2,1),'d',1,0) from dual) --
  • python浮點數表示專題及常見問題 - CSDN
    print(a.as_integer_ratio())print(b.as_integer_ratio())print(a == b)(1351079888211149, 4503599627370496)(5404319552844595, 18014398509481984)False為了解決運算中的問題
  • mysql 取每天專題及常見問題 - CSDN
    `司機id`LEFT JOIN 城市匹配數據 c ON a.`城市id` = c.`司機id` LEFT JOIN 城市匹配數據 c ON a.`城市id` = c.
  • linux內核移植-移植2.6.35.4內核到s3c2440
    硬體平臺:FL2440主機平臺:Ubuntu 11.04交叉編譯器:arm-linux-gcc 4.3.2原創作品,轉載請標明出處http://blog.csdn.net/yming0221/article/details/6604616
  • redis 槽是什麼專題及常見問題 - CSDN
    root@mysql ~]# redis-cli -p 9002 cluster keyslot hello (integer) 866槽不命中:moved異常[root@mysql ~]# redis-cli -p 9002 cluster keyslot php (integer) 9244[root@mysql ~]# redis-cli -c
  • Linux基礎命令之:實驗內容及小結
    本文引用地址:http://www.eepw.com.cn/article/257155.htm2.4實驗內容2.4.1在Linux下解壓常見軟體
  • 網格布局專題及常見問題 - CSDN
    grid-template-columns: 1fr 1fr 1fr 1fr;grid-template-rows: auto 300px;Areas 地區 grid-template-areas: "a a a a" "b c
  • windows10 修復啟動專題及常見問題 - CSDN
    C:\Users\user1> bcdboot c:\windows /s P: /f ALL /l zh-cn三、刪除無效的引導項正常啟動,進入 Windows 10,然後從命令提示符直接輸入 BCDedit 查看當前的引導項。