某業務人員反應系統登錄不上去,因而程序員本身試着登錄系統成功了,內心很自信的認爲「個人代碼沒有問題」,便讓業務人員再試試。而後業務人員是登錄成功了,可是整個系統用起來很卡,這下程序員意識到是系統的問題了。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
同時也引起了其餘的一些思考,總結後整理以下:數據庫
free -g
df -h
iostat -dx
top
具體的系統調優,本文不作介紹了。api
經常使用命令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配置的規則是:
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鳥哥的私房菜基礎學習第三版--12.4.2章節》