在工程化過程中遇到一個需求,需要在ubuntu環(huán)境下開啟一個定時任務,定時執(zhí)行sh腳本,下面參考網(wǎng)上的解決方案記錄如下。
1、crontab
linux中crontab命令用于設置周期性被執(zhí)行的指令,該命令從標準輸入設備讀取指令,并將其存放于“crontab”文件中,以供之后讀取和執(zhí)行。
可以使用 crontab 在每天的任何時間段自動運行任務,或在一周或一月中的不同時段運行。
crontab命令允許用戶提交、編輯或刪除相應的作業(yè)。每一個用戶都可以有一個crontab文件來保存調(diào)度信息。
crontab [-u username] [-l|-e|-r]
- -u: 只有root才能進行這個任務,也即幫其他用戶新建/刪除crontab工作調(diào)度;
- -e: 編輯crontab 的工作內(nèi)容;
- -l: 查閱crontab的工作內(nèi)容;
- -r: 刪除所有的crontab的工作內(nèi)容,若僅要刪除一項,請用-e去編輯。
直接輸入命令crontab -e 或者編輯文件/etc/crontab 就可以直接設置定時任務,如
# 每分鐘把hello world字符串寫入/home/string.txt文件中
* * * * * echo "hello world" >> /home/string.txt
2、crontab相關命令
安裝:apt-get install cron或yum install crontabs
啟動:service cron start
重啟:service cron restart
停止:service cron stop
檢查狀態(tài):service cron status
查詢cron可用的命令:service cron
設置開機自啟動:chkconfig --level 345 crond on
3、crontab例子
每天夜里0點執(zhí)行
0 0 * * * sh /root/test.sh
每晚的21:30重啟apache
30 21 * * * service httpd restart
每月1、11、21日的2:30重啟apache
30 2 1,11,21 * * service httpd restart
每月的1-10日的2:45重啟apache
45 2 1-10 * * service httpd restart
每隔2分鐘重啟apache
*/2 * * * * service httpd restart
晚上11點到早上7點之間,每隔一小時重啟apache
0 23-7 * * * service httpd restart
每天18點至23:00點之間,每隔30分鐘重啟apache
0,30 18-23 * * * service httpd restart
兩個小時運行一次
0 */2 * * * /root/test.sh
每天早上7點執(zhí)行一次 /bin/ls :
0 7 * * * /bin/ls
每天晚上1點調(diào)用
0 1 * * * sh /root/script/pg_backup.sh >/dev/null 2>&1
#每月凌晨一點執(zhí)行計劃任務
0 1 1 * * sh /usr/loacl/bin/cp_banmayun_log.sh >/dev/null 2>&1
每晚的21:30重啟smb
30 21 * * * /etc/init.d/smb restart
每周六、周日的1 : 10重啟smb
10 1 * * 6,0 /etc/init.d/smb restart
每一小時重啟smb
* */1 * * * /etc/init.d/smb restart
每周日的十一點執(zhí)行
00 23 * * 7 sh /root/Data_import.sh
每個工作日23:58都進行備份。
59 11 * * 1-5 /root/backup.sh
每個月的1號 23:00 運行清理備份腳本
00 23 1 * * /root/Clear_backup.sh
crontab每分鐘定時執(zhí)行:
*/1 * * * * service mysqld restart #每隔1分鐘執(zhí)行一次
*/10 * * * * service mysqld restart #每隔10分鐘執(zhí)行一次
crontab每小時定時執(zhí)行:
0 */1 * * * service mysqld restart #每1小時執(zhí)行一次
0 */2 * * * service mysqld restart #每2小時執(zhí)行一次
crontab每天定時執(zhí)行:
0 10 * * * service mysqld restart #每天10點執(zhí)行
30 19 * * * service mysqld restart #每天19點30分執(zhí)行
crontab每周定時執(zhí)行:
0 10 * * 1 service mysqld restart #每周一10點執(zhí)行
30 17 * * 5 service mysqld restart #每周五17點30分執(zhí)行
crontab每年定時執(zhí)行:
0 10 1 10 * service mysqld restart #每年的10月1日10點執(zhí)行
0 20 8 8 * service mysqld restart #每年的8月8日20點執(zhí)行
4、實例
通過crontab+監(jiān)測重啟腳本實現(xiàn)對指定名稱或指定端口的應用進程進行監(jiān)測,若監(jiān)測到進程掛掉則重新啟動,若檢測到進程正常則不做處理,實現(xiàn)進程探針的功能。
sh腳本如下(start.sh)
#!/bin/bash
cd /opt
pid=ps -ef | grep redis | grep -v grep | awk NR==1 | awk '{print $2}'
if [ ! -z $pid ];then
echo "redis is running, pid $pid"
exit 1
fi
cd /usr/local/redis
./bin/redis-server /config/redis.conf
其中,
第一行為指定bash啟動方式;
第二行為進入sh腳本所在目錄;
第三行為抓取redis進程并將進程號賦給pid變量,awk用法下面說明;
第四行為判斷pid變量是否為空,不為空則進入執(zhí)行echo并執(zhí)行exit 1退出;
awk逐行處理文本,安裝指定的分隔符,將行分割為多個字段,如果沒有指定分隔符,默認以空格為分隔符,每個字段按照順序,分別對應到awk的內(nèi)置變量中,比如,分割完后的第一個字段為1,第二個字段為2,以此類推,用$0表示當前處理的整個一行。
awk示例
# 取出文件中的第一行的第二列: NR==行號
ps -aux | grep ***.jar | awk 'NR==1 {print $2}'
crrontab -e文件中內(nèi)容添加如下
# 每1分鐘執(zhí)行一次
*/1 * * * * sh /opt/start.sh
注:sh腳本一定注意在vim編輯模式下編寫,否則容易出現(xiàn)語法錯誤,sh腳本一定要手動執(zhí)行測試。文章來源:http://www.zghlxwxcb.cn/news/detail-492615.html
5、小結
不同版本的Linux系統(tǒng)的相關服務命令不一樣,以上方式還需進行驗證,后續(xù)若有修改或補充會持續(xù)更新。文章來源地址http://www.zghlxwxcb.cn/news/detail-492615.html
到了這里,關于ubuntu環(huán)境下開啟定時任務crontab的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!