Jenkins 跑的回歸結果太多,清理不及時,老是爆盤。
可以通過shell 腳本寫一個清理的小程序,然后通過 crontab -e 來設置程序自動運行時間
1 因為我要刪除的是整個文件夾,所以,shell 內容如下:
!/bin/sh
find /project/project_name/run/ -maxdepth 1 -type d -mtime +1 |xargs rm -rf
如果想要刪除某些問價而不是文件夾,內容如下:
find /project/project_name/run/ -type f -mtime +1 -name "*" -exec rm -rf {} ;
2 此時運行shell 腳本只是可以清理文件,如何讓它定時運行:Linux terminal 下:
crontab -e // crontab:定時任務的守護進程,精確到分
40 18 * * * sh /shell_dir // 40 40分鍾, 18 表示18:00, 這句話意思是每天18:40運行shell 腳本
以下是對於find 和crontab 的解釋
find 轉載自 https://www.cnblogs.com/johnnyliu/archive/2013/04/09/3010384.html
linux中的find的命令查找文件的重要方式,輔以其他的bash命令可以實現強大的操作效果。
先看看放find命令的基本組成:
find pathname -option [-print -exec -ok ...]
分類記憶各項屬性參數~
pathname:指定find命令的查詢根路徑,例如 ‘ / ’,‘./ ' 等。
同時還可在-path參數中指定搜索路徑。
-option:
1、文件操作:
-name 用引號” “將查詢的文件名括起來,可適用於簡單的正則表達式(應改為shell的元字符,下同)。
-type 指定查找文件的類型
b - 塊設備文件。
d - 目錄。
c - 字符設備文件。
p - 管道文件。
l - 符號鏈接文件。
f - 普通文件。
-size n 指定文件大小,若數字前+表示大於,-表示小於;常用單位c(字節),k(KB),M(MB)
2、用戶權限:
-perm 用戶權限permission,用常用的三位數字,如644表示權限。若數字前+表示至少包括指定的一種訪問權限,-表示必須包括指定的所有訪問權限
-user / -nouser 按文件屬主查詢 / 查找無有效屬主的文件
-group / -nogroup 按文件所屬租來查 / 查找無有效所屬租的文件
3、時間選項:
-atime / -amin n 最近訪問(accessed)過的文件,前者表示單位是天(24h),后者單位是分鍾(minute);若數字前+表示n段時間前,-表示最近n段時間。后同。
-ctime / -cmin n 最近狀態改變(changed)過的文件
-mtime / -mmin n 最近內容修改(modified)過的文件
-newer file!otherfile 查找更改時間比file新的文件,加上非(!)則查找比otherfile舊的文件
(注意,邏輯符號包括!(not)、-a(and)、-o(or),在命令中都是短路求值,簡單講就是若后面的參數不影響邏輯判斷,則不對后面求值。在find命令中一般在選項之前添加邏輯符號)
4、文件路徑:
-follow 遇到符號鏈接文件,就跟蹤到鏈接指向的文件
-mount 不跨越文件系統的mount點,即在當前的文件系統查詢,不進入其他文件系統(如掛載的windows系統)
-path 給出文件路徑,可在路徑中查詢,滿足簡單正則表達式(元字符)。例如查找當前路徑中' ./var/www '子目錄中的’ index.html ’ 文件:
$ find . -path './var/www*' -name 'index.html' -print
./var/www/learn/study_smarty/templates/index.tpl
./var/www/learn/study_smarty/docs/index.php
./var/www/learn/index.php
./var/www/index.html
(結果中可以看到,-path選項中的參數要為模糊的查詢條件,我理解的-path選項查找出的文件名實際上是帶路徑的字符串,而-path中則是滿足結果字符串中的前面的路徑字符。)
-prune 指出要忽略的目錄。 結合-path選項,例如在當前目錄下查找‘ index.html ’文件,同時忽略路徑下的‘ /www/bin ’目錄:
$ find . -path './www/bin' -prune -o -name 'index.html' -print
-path “./www/bin” -prune -o -name 'index.html' -print 是 -path “./www/bin” -a -prune -o -name 'index.html' -print 的簡寫表達式。按順序求值,-a 和 -o 都是短路求值,與 shell 的 && 和 || 類似如果 -path “./www/bin” 為真,則求值 -prune , -prune 返回真,“與”邏輯表達式為真;否則不求值 -prune,與邏輯表達式為假。如果 -path “/usr/sam” -a -prune 為假,則求值 -name。-name返回真,“或”邏輯表達式為真;否則不求值 -name,“或”邏輯表達式為真。
(因此,其他的查詢條件必須放在-o之后!而-path選項一般放在最前,-prune和-o也要連用)
避開多個文件可以用:
$ find /usr (-path /usr/dir1 -o -path /usr/dir2 ) -prune -o -name "index.html" -print
‘ (’ 與 ‘ ) ’ 表示轉義,及shell不再對括號做特殊解釋,這里轉義后的括號表示結合。
(注意,路徑后不能在加 ‘/’ 號!)
-depth 先匹配所有的文件,再在子目錄中查找。即廣度遍歷查詢。注意加上-depth選項后,-prune選項失效。
-maxdepth n 設定遞歸搜索的目錄層級,1為在當前目錄下,即不遞歸搜索。
5、查詢執行:
-exec command {} ; 對查詢的結果文件執行command 命令,{}中就包含着查詢結果。
-ok command {} ; 與-exec有着相同的操作,不同的是,在執行command命令時會有交互提示你是否執行,是一種相對安全的做法。
在使用find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鍾之后,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。在有些系統中,使用-exec選項會為處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高。轉
xargs 與pipe連用,對匹配的文件執行操作。
find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然后是下一批,並如此繼續下去。使用xargs命令則只有一個進程。轉
例如,在當前路徑下的普通文件中搜索‘ admin ’:
$ find . -type f -print | xargs grep 'admin'
對於一個參數的命令,xargs隱含傳遞匹配文件,如上述grep files,將結果隱含傳遞給files。如是多參數命令,如cp file dir,則要利用xargs的 -i 選項,例如將上述查詢的問價copy至‘ /usr ’:
$ find . -type f -print | xargs -i cp {} /usr/
加上 -i 選項后,xargs將匹配的結果傳遞給 {} ,這樣就方便多參數命令的使用了。
對於crontab 的解釋: 轉載自https://www.cnblogs.com/ftl1012/p/crontab.html
usage: crontab [-u user] file
crontab [-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)
-s (s定時任務分類
Linux下的任務調度分為兩類,系統任務調度和用戶任務調度。
系統任務調度:系統周期性所要執行的工作,比如寫緩存數據到硬盤、日志清理等。
在/etc/crontab文件,這個就是系統任務調度的配置文件。
用戶任務調度:用戶定期要執行的工作,比如用戶數據備份、定時郵件提醒等。
用戶可以使用 crontab 工具來定制自己的計划任務。
在crontab 文件都被保存在/var/spool/cron目錄中。其文件名與用戶名一致
1.系統定時任務:例如清理系統日志,清理系統緩存 -->不過多的關注
查詢系統定時處理任務的路徑:
路徑1:
cd /etc/logrotate.d/ -->可以寫定時任務
less syslog
路徑2:
cat /etc/crontab -->不推薦使用,但是可以看格式
路徑3:
ls /etc/ | grep cron*
anacrontab
cron.d -->同路徑2 ,可以寫定時任務
cron.daily
cron.deny -->控制普通用戶使用定時任務crontab
cron.hourly
cron.monthly
crontab
cron.weekly
2.用戶的定時任務 -->關注重點
crontab文件內容分析
cat /etc/crontabelinux context)
星號(*):代表所有可能的值,如month字段為星號,則表示在滿足其它字段的制約條件后每月都執行該命令操作。
逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,“1,2,5,7,8,9”
中杠(-):可以用整數之間的中杠表示一個整數范圍,例如“2-6”表示“2,3,4,5,6”
正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。
小 結:
數字的表示最好用2為阿拉伯數字顯示
周和日最好不要同時用
定時任務要加注解
可以定向到日志文件或者空文件
定時任務一定是絕對路徑,且目錄必須存在才能出結果
crontab 服務一定要開啟運行
crontab日志路徑
【日志是按照天排列的】
ll /var/log/cron*
/var/log/cron只會記錄是否執行了某些計划的腳本,但是具體執行是否正確以及腳本執行過程中的一些信息則linux會每次都發郵件到該用戶下。
常用的命令展示
安裝crontab:
1
yum install crontabs
crontab服務操作說明:
1
2
3
4
5
6
7
/sbin/service crond start //啟動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重啟服務
/sbin/service crond reload //重新載入配置
查看crontab服務狀態:
1
service crond status
手動啟動crontab服務:
1
service crond status
查看crontab服務是否已設置為開機啟動,執行命令:
1
2
方法一: 界面啟動 ntsysv
方法二: 加入開機自動啟動: chkconfig –level 35 crond on
crontab -l查看定時任務列表
編輯定時任務
1
crontab –e
1
==》vim /var/spool/cron/root
每隔2分鍾輸出時間到文件
1
*/2 * * * * echo date
>> $HOME>test.txt
crontab -r 刪除定時任務
1
2
3
==> 從/var/spool/cron目錄中刪除用戶的crontab文件
==> 如果不指定用戶,則默認刪除當前用戶的crontab文件
crontab –i 在刪除用戶的crontab文件時給確認提示
備份crontab文件
1
crontab -l > $HOME/mycron
恢復丟失的crontab文件
1
2
3
如果不小心誤刪了crontab文件,假設你在自己的$ H O M E目錄下還有一個備份,那么可以將其拷貝到/var/spool/cron/
crontab
有些crontab的變體有些怪異,所以在使用crontab命令時要格外小心。如果遺漏了任何選項,crontab可能會打開一個空文件,或者看起來像是個空文件。這時敲delete鍵退出,不要按
每小時執行/etc/cron.hourly目錄內的腳本
0 * * * * root run-parts /etc/cron.hourly
每隔2分鍾同步一次互聯網時間
echo "*/2 * * * * /usr/bin/ntpstat time.windows.com >/dev/null 2>&1" >> /var/spool/cron/root
每天3-5,17-20每隔30分鍾執行一次腳本
echo "*/30 [3-5],[17-20] * * * /bin/sh /home/omc/h.sh >/dev/null 2>&1" >> /var/spool/cron/root
當天23點,第二天0點到凌晨7點 每隔1分鍾執行一次腳本
- 23,00-07/1 * * * /bin/sh /home/omc.h.sh
每年的4月份每周的周一到周三的11點執行腳本
00 11 * 4 1-3 /bin/sh /home/omc/h.sh
crontab的注意事項
- 注意環境變量問題
在crontab文件中定義多個調度任務時,需要特別注意的一個問題就是環境變量的設置
腳本中涉及文件路徑時寫全局路徑;
腳本執行要用到java或其他環境變量時,通過source命令引入環境變量,如:
cat start_cbp.sh
!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
當手動執行腳本OK,但是crontab死活不執行時。可以嘗試在crontab中直接引入環境變量解決問題。
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
2. 系統級任務調度與用戶級任務調度
root用戶的任務調度操作可以通過“crontab –uroot –e”來設置,也可以將調度任務直接寫入/etc/crontab文件,需要注意的是,如果要定義一個定時重啟系統的任務,就必須將任務放到/etc/crontab文件,即使在root用戶下創建一個定時重啟系統的任務也是無效的。
3.其他注意事項
當crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題。或者查看日志看某個job有沒有執行/報錯tail -f /var/log/cron。
千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的所有crontab都沒了。
在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義%,如經常用的date ‘+%Y%m%d’在crontab里是不會執行的,應該換成date ‘+%Y%m%d’
4. 生產調試定時任務
1.增加執行任務的頻率調試
2.調整系統時間調試任務,提前5分鍾 -->不用於生產環境
3.通過腳本日志輸出調試定時 任務
4.注意一些任務命令帶來的問題 -->確保命令的正確性
5.crontab箴言
1.環境變量問題,例如crontab不能識別Java的環境變量
crontab執行shell時,只能識別為數不多的環境變量,普通的環境變量是無法識別的,所以在編寫shell時,最好使用export重新聲明變量,確保腳本執行。
2.命令的執行最好用腳本
3.腳本權限加/bin/sh,規范路徑/server/scripts
4.時間變量用反斜線轉義,最好用腳本
5.定時任務添加注釋
6.>/dev/null 2>&1 ==>&>/dev/null,別隨意打印日志文件
7.定時任務里面的程序腳本盡量用全路徑
8.避免不必要的程序以及命令輸出
9.定時任務之前添加注釋
10.打包到文件目錄的上一級