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

背景

某業務人員反應系統登陸不上去,於是程序員自己試着登陸系統成功了,心裏很自信的認爲“我的代碼沒有問題”,便讓業務人員再試試。然後業務人員是登陸成功了,但是整個系統用起來很卡,這下程序員意識到是系統的問題了。

排查步驟

因爲剛剛上線了新的功能,想到了配置了定時任務,可能是定時任務配置錯誤,導致PHP啓了過多進程。

使用命令ps -ef | grep php 查看,果然是起了很多沒必要的更新數據腳本,其中涉及到與第三方接口的交互並且有大量的更新數據庫的操作,所以直接導致系統卡頓。

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

# 錯誤配置
* */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

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

思考

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

同時也引發了其他的一些思考,總結後整理如下:

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

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

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

awk命令的基本使用

常用命令

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:每月1、10、22日的4 : 45重啓smb 
命令:
45 4 1,10,22 * * /etc/init.d/smb restart
 
實例8:每週六、週日的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/一次定時任務配置錯誤引發的思考/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章