Linux之定時任務補充

来源:http://www.cnblogs.com/0zcl/archive/2017/05/14/6852201.html
-Advertisement-
Play Games

定時任務兩實例 例1: 每分鐘列印一次自己的名字拼音全拼到“/server/log/自己的名字命名的文件”中。 錯誤示例: 解答知識小結: 1、定時任務要加註釋2、如果已經要定向到文件中,結尾不要有>/dev/null 2>&13、/server/log目錄必須要存在才能出結果,如沒有創建這個目錄。 ...


 

定時任務兩實例

例1: 每分鐘列印一次自己的名字拼音全拼到“/server/log/自己的名字命名的文件”中。

[root@chengliang log]# mkdir -p /server/log/
[root@chengliang log]# echo "chensiqi" >>/server/log/chengliang
[root@chengliang log]# crontab -l
#time sync by zcl at 2017/5/8
*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
[root@chengliang log]# crontab -e     ==>設置定時任務,加上下麵這兩句
#print my name to log by zcl at 2017/5/12
*/1 * * * * /bin/echo "my name is zcl" >> /server/log/chengliang
[root@chengliang log]# 

錯誤示例:

#print my name to log by chensiqi at 2017211
*/1 * * * * /bin/echo "chensiqi" >>/server/log/chensiqi >dev/null 2>&1
提示:這是一個錯誤的定時任務,請同學們思考錯在了哪裡?

解答知識小結:

1、定時任務要加註釋
2、如果已經要定向到文件中,結尾不要有>/dev/null 2>&1
3、/server/log目錄必須要存在才能出結果,如沒有創建這個目錄。
4、定時任務中的路徑一定要絕對路徑
5、crond服務必須首先開啟
6、查看定時任務日誌tail /var/log/cron

 

例2:每周六,日上午9點和下午14點(執行/server/scripts/chensiqi.sh).要求:/server/scripts/chensiqi.sh腳本的功能是列印當天的日期:格式為2017-02-11可以隨意。

解答:

##execute chengliang.sh by zcl at 2017/5/14
00 9,14 * * 0,6 /bin/sh /server/scripts/chengliang.sh >/dev/null 2>&1

步驟:

1、創建對應的目錄

mkdir /server/scripts -p

2、命令行測試

[root@chengliang log]# date +%F
2017-05-14
[root@chengliang log]# 

3、書寫腳本

[root@chengliang scripts]# echo 'date +%F' >/server/scripts/chensiqi.sh
[root@chengliang scripts]# cat chengliang.sh
date +%F
[root@chengliang scripts]# 

4、命令行測試腳本

[root@chengliang scripts]# /bin/sh /server/scripts/chengliang.sh
2017-05-14
[root@chengliang scripts]# 

5、編輯定時任務(讓他快速執行* * * * *)

crontab -e
==>增加下麵的定時任務
*/5 * * * * /bin/sh /server/scripts/chensiqi.sh >>/server/log/chengliang.log

6、測試

tail -f /server/log/chengliang.log
2017-5-14

7、按照原來的要求更改定時任務的時間

##execute chengliang.sh by zcl at 2017/5/14
00 9,14 * * 0,6 /bin/sh /server/scripts/chengliang.sh >/dev/null 2>&1

 

定時任務書寫要領

  • 要領1:為定時任務規則加必要的註釋

加必要註釋寫定時任務規則時儘可能的加上註釋(最好是英文註釋),這是個好的習慣和規範。
例如:誰在什麼時間幹了什麼(註釋內容)什麼人,什麼時間,因為什麼,做了什麼。如果這些都標記清楚了,這樣其他的運維人員可以很容易的理解任務的信息,從而提升團隊的工作效率。

  • 要領2:執行shell腳本任務前加/bin/sh

執行定時任務時,如果是執行腳本,請儘量在腳本前面加上/bin/sh命令,否則有可能因為忘了為腳本設定執行許可權(x),從而以為OK了,結果無法完成任務,這樣就“悲劇”了

  • 要領3:定時任務命令或腳本的結尾加>/dev/null 2>&1

定時任務(一般是腳本任務)規則的結尾最好加上>/dev/null 2>&1等內容,如果需要列印日誌,則可以追加到指定的日誌文件里(此時不要和/dev/null同時存在),儘量不要留空。如果任務是命令的話,結尾使用“>/dev/null 2>&1”時要多測試下,要有檢查手段。如:*/1 * * * * echo "==" >>/tmp/chensiqi.log>/dev/null 2>&1 任務規則就是無法執行的。

  • 要領4:定時任務命令超過2條的命令執行,最好用腳本文件

超過2條的命令執行,最好用腳本文件。下麵的方法就是不規範的,不專業的。

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

標準寫法:

[root@chensiqi /]# cat /server/scripts/log.sh
sleep1
echo chensiqi >> /server/log/chensiqi.log
  • 要領7:定時任務命令或程式最好寫到腳本里執行

  • 要領8:定時任務執行的腳本要規範路徑

    • 例如:/server/scripts
  • 要領9:配置定時任務規範操作過程,防止出錯。

1,首先要在命令行操作成功,然後複製成功的命令到腳本里,在各個細小環節減少出錯的機會。
2,然後測試腳本,測試成功後,複製腳本的規範路徑到定時任務配置里,不要手敲。
3,先在測試環境下測試,然後正式環境規範部署

 

在命令行輸入./chensiqi.sh(/server/scripts/chensiqi.sh)與sh chensiqi.sh區別在哪?

[root@chengliang scripts]# ls
chengliang.sh
[root@chengliang scripts]# sh chengliang.sh
2017-05-14
[root@chengliang scripts]# 
[root@chengliang scripts]# ./chengliang.sh
-bash: ./chengliang.sh: Permission denied
[root@chengliang scripts]# 

命令說明: sh chensiqi.sh表示用/bin/sh這個命令來解析並啟動chensiqi.sh這個腳本。而./chensiqi.sh表示利用linux的預設解釋器來解析並啟動這個腳本。因此,./chensiqi.sh需要linux下x的執行許可權,而sh chensiqi.sh不需要

 

定時任務不加>/dev/null 2>&1的後果

  • 如果定時任務規則結尾不加>/dev/null 2>&1等命令配置,有可能有大量輸出信息,時間長了,可能由於系統未開啟郵件服務而導致郵件臨時目錄/var/spool/clientmqueue 文件數猛增的隱患發生,大量文件會占用大量磁碟inode節點(每個文件占一個inode),以致磁碟inode滿而無法寫入正常數據(下文有案例)。
  • 提示:上面的>/dev/null 2>&1 寫法也可以寫成1>/dev/null 2>/dev/null,例:$JAVA-jar $RESIN_HOME/lib/resin.jar $ARGS stop 1>/dev/null 2>/dev/null 此寫法來自resin服務預設啟動腳本
  • 上述是centos5.8的情況,假如系統不安裝sendmail(Centos6.4),那是不是就沒有上述問題了?

 

企業案例:如果定時任務規則結尾不加>/dev/null 2>&1,很容易導致硬碟inode空間被占滿,從而系統服務不正常。

當一個定時任務執行的時候,就會給系統發一封郵件。sendmail郵件服務,經常是關閉的,所以定時任務發送的郵件就會臨時堆在/var/spool/clientmqueue/,時間長了,/var/spool/clientmqueue/文件數特別多。Centos5的時候一定會有這個問題。

Centos6呢?請往下看。

[root@chensiqi1 ~]# cat /etc/redhat-release 
CentOS release 6.8 (Final)
[root@chensiqi1 ~]# crontab -l 
#go to chensiqi trainning by chensiqi at 20170211
* * * * * /bin/sh /root/chensiqi.sh
[root@chensiqi1 ~]# ls /var/spool/postfix/maildrop/
D3AD0C6  DB2BAC9  E14E6D0  E5222D1
[root@chensiqi1 ~]# 

命令說明:

定時任務沒定向到空,postfix服務沒有開啟的話,那麼每執行一次定時任務,/var/spool/postfix/maildrop/文件夾下就會產生一個小文件,隨著時間累計,就會越來越多,導致出現問題。 如果開啟了郵件服務,就會直接給root發送郵件。

解決方法:

1、刪除大量小文件/var/spool/postfix/maildrop/下所有文件(ls|xargs rm -f)
2、臨時開啟postfix(sendmail)服務
3、vi /etc/crontab:將‘MAILTO=root’替換成‘MAILTO=“”’然後service crond restart即可。(如果還不行,crontab -e 第一行增加MAILTO=“”)

 

亡羊補牢:

定時任務定向到空>/dev/null 2>&1

目錄名解釋
/var/spool/clientmqueue centos5.xsendmail臨時郵件文件目錄,有很多原因會導致這個目錄碎文件很多,比如crontab定時任務命令不加>/dev/null等,並且sendmail服務沒開。工作中偶爾會因為該目錄文件太多,導致/var所在的分區inode數量被消耗盡,無法寫入文件的情況
/var/spool/postfix/maildrop/ centos6.x postfix臨時隊列目錄/var/spool/postfix/maildrop/預設定時任務執行時會給root發郵件,如果郵件服務不開,就會把郵件推到上述目錄。當定時任務結尾不加>/dev/null 2>&1的時候,定時任務就會在上述目錄存大量小文件

 

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

[root@chensiqi1 ~]# cat /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
  • SHELL=/bin/bash #shell解釋器
  • PATH=/sbin:/bin:/usr/sbin:/usr/bin #PATH環境變數
  • MAILTO=root #定義如果任務有輸出,發給哪個用戶,預設發給root用戶
  • HOME=/ #定時任務執行命令從根目錄開始

root用戶執行crontab -e命令實際修改的是/var/spool/cron/root的root文件

[root@chengliang scripts]# cat /var/spool/cron/root  
#time sync by zcl at 2017/5/8
*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

  

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

在調試時,把任務執行頻率調快一點,如:每分鐘,每5分鐘執行一次,或者比當前時間推遲5分鐘以後,看能否執行,是不是按照你想象的去執行了,如果正常沒問題了,在改成需要的任務的執行時間。

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

規範的公司開發和運維人員操作流程,個人的開發配置環境-->辦公室的測試環境-->idc機房的測試環境-->idc機房的正式環境。

 

參考博客: http://www.cnblogs.com/chensiqiqi/p/6389611.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉載請註明:http://www.cnblogs.com/igoslly/p/6853730.html 調用子Activity 需要子Activity返回值 MainActivity使用startActivityForResult方法 MainActivity使用startActivityForRe ...
  • MySQL多實例簡單的說就是在一臺伺服器上安裝一套MySQL程式,通過不同的埠對外提供訪問,多實例不僅節省物理主機成本,還有效提升了單台物理主機的CPU、磁碟I/O使用效率,而且還可以在多實例之間做部署資料庫HA方案,根據不同的配置文件和啟動文件配置多實例,這種方法邏輯和配置簡單,但是不方便管理。 ...
  • 一下是我學習Oracle時的基礎練習,涵蓋了編程中的重點知識!特別適合用來複習! 轉載記得標註!!! ...
  • 用一條SQL語句查出每門課都大於80分的學生的姓名,數據表結構如下: 建表SQL如下: 查詢每門課都大於80分的同學的姓名: 查詢平均分大於80的學生的姓名: ...
  • ( 自己寫的插件,數據序列化,格式化拋出的異常都會導致flume停止,不能繼續取數據,異常可以自己處理 ) 最近在用Flume做數據的收集。用到了裡面的Spooldir的源在使用中有如下的問題: 如果文件的某一行有亂碼,不符合指定的編碼規範,那麼flume會拋出一個exception,然後就停在那兒 ...
  • 1、行列轉換: decode(條件,值1,返回值1,值2,返回值2,...值n,返回值n,預設值); select decode(sign(變數1-變數2),-1,變數1,變數2) from dual; --取較小值 sign()函數根據某個值是0、正數還是負數,分別返回0、1、-1 例如: 變數1 ...
  • 一、 DFS:distributied file system 是一種允許文件通過網路在多台主機上風向的文件系統,可讓多機器上的多用戶分享文件和存儲空間 二、HDFS的shell **切記後面加的 / 符號 三、HDFS的dfsadmin命令 ...
  • 如圖: 無法安裝原因都是這幾個工具無法識別10.0這個版本,可以修改註冊表來先完成安裝,然後再改回去 PHPManager的修改方法如下: 打開註冊表工具(運行Regedt32),找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SV... ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...