一次定時任務配置錯誤引起的思考

背景

某業務人員反應系統登錄不上去,因而程序員本身試着登錄系統成功了,內心很自信的認爲「個人代碼沒有問題」,便讓業務人員再試試。而後業務人員是登錄成功了,可是整個系統用起來很卡,這下程序員意識到是系統的問題了。php

排查步驟

由於剛剛上線了新的功能,想到了配置了定時任務,多是定時任務配置錯誤,致使PHP啓了過多進程。linux

使用命令ps -ef | grep php 查看,果真是起了不少不必的更新數據腳本,其中涉及到與第三方接口的交互而且有大量的更新數據庫的操做,因此直接致使系統卡頓。ios

使用命令crontab -l查看crontab配置,有幾個腳本的執行頻率是想配置成每小時執行一次,結果配置錯誤,致使每分鐘執行一次。具體以下:git

# 錯誤配置
* */1 * * * /usr/local/bin/php /data/site/demo/yii demo/sync-product

# 正確配置
0 */1 * * * /usr/local/bin/php /data/site/demo/yii demo/sync-product

問題是排查到了,如今須要作的就是快速kill掉那些不必的進程。這時候便想到了萬能的awk命令,以下:程序員

ps -ef | grep php | awk '{print $2}' | xargs kill -9

執行後,系統開始恢復穩定。github

思考

整個問題排查總結下來,歸根結底仍是配置crontab是不夠細心。shell

同時也引起了其餘的一些思考,總結後整理以下:數據庫

系統忽然出現卡頓,經常使用的排查思路有哪些呢?

  1. 查看內存使用情況:free -g
  2. 查看磁盤使用情況:df -h
  3. 查看磁盤I/O使用:iostat -dx
  4. 查看CPU使用:top

具體的系統調優,本文不作介紹了。api

awk命令的基本使用

經常使用命令yii

awk '條件類型 1{動做1} 條件類型2{動做2} ...' filename

awk後面接兩個引號並加上大括號來設置想要對數據進行的處理動做。

例如:咱們要取出帳號與登陸者的IP,且之間以[TAB]隔開,則:

[release@api_02 ~]$ last -n 5 | awk '{print $1 "\t" $3}'
release    117.111.111.11
release    117.111.111.11
release    117.111.111.11
release    117.111.111.11
release    117.111.111.11

awk還存在一些內置變量

變量名稱 表明意義
NF 每一行擁有的字段總數
NR 目前awk處理的是第幾行
FS 目前的分隔符,默認爲空格鍵

繼續上面的例子,需求爲:

  • 列出每一行的帳號
  • 列出目前處理的行數
  • 說明該行有多少字段
[release@api_02 ~]$ last -n 5 | awk '{print $1 "\t lines:" NR "\t columns:"NF}'
release     lines:1     columns:10
release     lines:2     columns:10
release     lines:3     columns:10
release     lines:4     columns:10
release     lines:5     columns:10

awk命令還有更多高級的功能,此處就不作介紹了。

crontab配置的基本使用

crontab配置的規則是:

minute   hour   day   month   week   command

其中每一個字段的含義以下:

minute: 分鐘,取值範圍:0-59之間的整數

hour:小時,取值範圍:0-23之間的整數

day:日期,取值範圍:1-31之間的整數

month:月份,取值範圍:1-12之間的整數

week:星期幾,取值範圍:0-7之間的整數,這裏的0或7表明星期日

command:要執行的命令,能夠是系統命令,也能夠是本身編寫的腳本文件。

特殊字符:

星號(*):表示全部值

逗號(,):能夠用逗號隔開的值指定一個列表範圍,例如,「1,2,6,7」

中槓(-):能夠用整數之間的中槓表示一個整數範圍,例如「1-3」表示「1,2,3」

正斜線(/):能夠用正斜線指定時間的間隔頻率,例如「0-23/2」表示每兩小時執行一次。同時正斜線能夠和星號一塊兒使用,例如*/10,若是用在minute字段,表示每十分鐘執行一次。

經常使用的一些例子

實例1:每1分鐘執行一次command
命令:
* * * * * command
 
實例2:每小時的第3和第15分鐘執行
命令:
3,15 * * * * command
 
實例3:在上午8點到11點的第3和第15分鐘執行
命令:
3,15 8-11 * * * command
 
實例4:每隔兩天的上午8點到11點的第3和第15分鐘執行
命令:
3,15 8-11 */2 * * command
 
實例5:每一個星期一的上午8點到11點的第3和第15分鐘執行
命令:
3,15 8-11 * * 1 command
 
實例6:每晚的21:30重啓smb 
命令:
30 21 * * * /etc/init.d/smb restart
 
實例7:每個月一、十、22日的4 : 45重啓smb 
命令:
45 4 1,10,22 * * /etc/init.d/smb restart
 
實例8:每週6、週日的1 : 10重啓smb
命令:
10 1 * * 6,0 /etc/init.d/smb restart
 
實例9:天天18 : 00至23 : 00之間每隔30分鐘重啓smb 
命令:
0,30 18-23 * * * /etc/init.d/smb restart

參考資料

linux卡頓怎麼排查

《Linux鳥哥的私房菜基礎學習第三版--12.4.2章節》

原文連接

https://tsmliyun.github.io/2019/10/16/一次定時任務配置錯誤引起的思考/

相關文章
相關標籤/搜索