技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

當前位置:主頁 > 教程 > 服務(wù)器類 >

Linux下設(shè)置定期執(zhí)行腳本

來源:技術(shù)員聯(lián)盟┆發(fā)布時間:2018-06-22 12:30┆點擊:

  在Linux下,經(jīng)常需要定期的執(zhí)行一些腳本從而來實現(xiàn)一些功能。

  在Linux下我們用crontab來實現(xiàn)定期的執(zhí)行腳本這個功能,下面就介紹一下crontab的使用。以及我遇到的一些問題

  一. crontab的使用說明

  1. crond 是linux用來定期執(zhí)行程序的命令。當安裝完成操作系統(tǒng)之后,默認便會啟動此任務(wù)調(diào)度命令。crond命令每分鐘會定期檢查是否有要執(zhí)行的工作,如果有要執(zhí)行的工作便會自動執(zhí)行該工作。而linux任務(wù)調(diào)度的工作主要分為以下兩類

  a. 系統(tǒng)執(zhí)行的工作,比如垃圾清理,備份

  b. 用戶自定義的工作,比如每5分鐘執(zhí)行一次腳本

  2. crontab是UNIX系統(tǒng)下定期執(zhí)行任務(wù)的觸發(fā)器。用戶把要定期執(zhí)行的任務(wù)記錄在這個文件下面,然后crond定期的去檢查這個定期執(zhí)行列表,有要執(zhí)行的工作時便自動執(zhí)行。

  通過man crontab可以查看到下面的信息

  a. /etc/crond.allow 表示的是允許使用crontab的用戶列表

  b. /etc/crond.deny 表示的是不允許使用crontab的用戶列表

  3. crontab常用的幾個命令格式

  crontab -l //顯示用戶的crontab文件的內(nèi)容

  crontab -e //編輯用戶的crontab文件的內(nèi)容

  crontab -r //刪除用戶的crontab文件

  4. crontab文件的基本格式如下所示

  * * * * * command

  分 時 天 月 周 命令

  每列表示意義

  a. 第一個*表示的是分鐘1~59分鐘,默認*表示的是每分鐘都執(zhí)行,x-y表示的是x~y這段每分鐘都執(zhí)行,*/n表示每n分鐘執(zhí)行一次,x,y,z表示的是x,y,z分鐘都執(zhí)行。

  b. 第二個*表示的是小時1~23小時,默認*表示的是每小時都執(zhí)行,x-y表示的是x~y這段每小時都執(zhí)行,*/n表示每n小時執(zhí)行一次,x,y,z表示的是x,y,z小時都執(zhí)行。

  c. 第三個*表示的是天1~31,默認*表示的是每天都執(zhí)行,x-y表示的是x~y這段每天都執(zhí)行,*/n表示每n天執(zhí)行一次,x,y,z表示的是x,y,z天都執(zhí)行。

  d. 第四個*表示的是月1~12,默認*表示的是每個月都執(zhí)行,x-y表示的是x~y這個段每月都執(zhí)行,*/n表示每n分鐘執(zhí)行一次,x,y,z表示的是x,y,z天都執(zhí)行。

  e. 第五個*表示的是周0~6(0表示周天),默認周一~周天都執(zhí)行,x-y表示周x~周y每天都執(zhí)行。

  5. crontab文件的一些例子

  a. 30 21 * * * /usr/local/etc/rc.d/lighttpd restart //表示每天21:30重啟apache

  b. 45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart //表示每月1,10,22號4:45重啟apache

  c. 0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart //表示每天18 : 00至23 : 00之間每隔30分鐘重啟apache

  d. * */1 * * * /usr/local/etc/rc.d/lighttpd restart //表示每一小時重啟apache

  e. */5 * * * * /usr/local/etc/rc.d/lighttpd restart //表示每5分鐘重啟apache

  二. 具體例子

  1. 首先我在/home/chenguolin/tmp/ 創(chuàng)建一個shell腳本名為s.sh。注意腳本內(nèi)部的路徑使用絕對路徑。

  這個腳本的功能就是把當前的日期輸出重定向到當前目錄下的out文件

  2. 然后設(shè)置每2分鐘執(zhí)行一次這個腳本,>/dev/null 2>&1。原因是因為系統(tǒng)會在每次執(zhí)行完任務(wù)之后就發(fā)一個郵件告訴用戶,通過這個操作可以把信息全部重定向到/dev/null中,/dev/null這個文件類似回收站過一段時間系統(tǒng)自動清理。

  */2 * * * * sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1

  然后發(fā)現(xiàn)過了n個2分鐘,out文件根本就沒有輸出。

  3. 在谷歌/百度無果之后,問了同事,得到了原因是因為crontab可能有時候沒有辦法執(zhí)行用戶家目錄下面的兩個文件,分別是.bashrc和.bash_profile

  這兩個文件的作用如下

  .bashrc作用是用于你的bash shell的bash信息,當?shù)卿洉r及每次打開新的shell時,該文件被讀取;

  .bash_profile作用是每個用戶都可使用該文件輸入專用于自己使用的shell信息,當用戶登錄時,該文件僅僅執(zhí)行一次!默認情況下,他設(shè)置一些環(huán)境變量,執(zhí)行用戶的.bashrc文件,

  因此我們要手動在crontab文件中添加source /home/chenguolin/.bashrc && source /home/chenguolin/.bash_profile

  source的作用是當前bash環(huán)境下執(zhí)行命令,而scripts是啟動一個子shell來執(zhí)行命令。這樣如果把設(shè)置環(huán)境變量(或alias等等)的命令寫進scripts中,就只會影響子shell,無法改變當前的BASH,所以通過文件(命令列)設(shè)置環(huán)境變量時,要用source 命令。

  因此crontab文件中變成

  */2 * * * * source && /home/chenguolin/.bashrc && source /home/chenguolin/.bash_profile && sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1

  4. 發(fā)現(xiàn)可以定時的執(zhí)行腳本。

  如果還不行,那只能通過查找log來查錯。非ubuntu的Linux crond的日志文件保存在/var/log下

  三. ubuntu下使用crontab定時執(zhí)行腳本

  注意下幾個問題以

  1. ubuntu下crontab的服務(wù)程序是cron,并且默認cron服務(wù)的log是沒有的,我們必須手動開啟

  a. sudo vim /etc/rsyslog.d/50-default.conf

  b. 找到cron.*那一行把注釋去掉

  c. 然后重啟cron服務(wù) sudo service cron restart

  d. 這樣就可以在/var/log里面發(fā)現(xiàn)有cron的日志文件了,我們就可以通過查看日志文件找到問題所在

  2. ubuntu下,用戶家目錄下是沒有.bash_profile文件的,并且會自動去執(zhí)行.bashrc文件,只要寫成下面這樣即可

  */2 * * * * sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1