ubuntu 下執行定時任務

Window shell文件在linux系統下執行不了的解決辦法php

一些人喜歡用vim來寫linux shell script, 可是, 有的人喜歡在Windows下用一些方便的編輯器(好比鼎鼎大名的Notepad++)寫好, 而後拷貝文件到linux下, 結果呢, 在執行腳本a.sh的時候, 會出現以下問題:linux

[taoge@localhost learn_shell]$ ./a.sh 
bash: ./a.sh: /bin/bash^M: bad interpreter: No such file or directory
[taoge@localhost learn_shell]$ 

什麼緣由呢, 咱們有理由懷疑是文件格式問題? 咱們用vim a.sh進入a.sh這個文件, 而後在底部模式下, 執行:set ff查看一下, 結果發現fileformat=dos, 看看, 果真是文件格式問題, 那怎麼解決呢?nginx

 

 

     方法一:vim a.sh進入a.sh後, 在底部模式下, 執行:set fileformat=unix後執行:x或者:wq保存修改。 而後就能夠執行./a.sh運行腳本了。(我親自試過, 是ok的)shell

     方法二:直接執行sed -i "s/\r//" a.sh來轉化, 而後就能夠執行./a.sh運行腳本了。(我親自試過, 是ok的)ubuntu

     方法三:直接執行dos2unix a.sh來轉化, 而後就能夠執行./a.sh運行腳本了。(個人linux上執行dos2unix ./a.sh失敗, 可是不要放棄啊, 加個busybox就能夠了), 以下:vim

dos2unix a.sh 
bash: dos2unix: command not found
[taoge@localhost learn_shell]$ busybox dos2unix a.sh 
[taoge@localhost learn_shell]$

實際上, 通過上述三種方法修改後, 咱們均可以再用:set ff再查一下, 發現a.sh的fileformat果真是unix了。   第三種方法最方便, 建議用第三種!windows

執行定時任務的步驟(使用crontab,讓linux定時執行shell腳本)bash

使用crontab你能夠在指定的時間執行一個shell腳本或者一系列Linux命令。例如系統管理員安排一個備份任務使其天天都運行框架

 

入門less

# crontab –e

這樣能夠已編輯模式打開我的的crontab配置文件,而後加入一下這行:
0 0 * * * /home/linrui/XXXXXXXX.sh

這將會在天天凌晨運行 指定的.sh文件

Cron 各項的描述

如下是 crontab 文件的格式:

{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} 
o minute: 區間爲 0 – 59 
o hour: 區間爲0 – 23 
o day-of-month: 區間爲0 – 31 
o month: 區間爲1 – 12. 1 是1月. 12是12月. 
o Day-of-week: 區間爲0 – 7. 週日能夠是0或7.

Crontab 示例

一、在 凌晨00:01運行

1 0 * * * /home/linrui/XXXX.sh

二、每一個工做日23:59都進行備份做業。

59 11 * * 1,2,3,4,5 /home/linrui/XXXX.sh   

或者以下寫法:

59 11 * * 1-5 /home/linrui/XXXX.sh

三、每分鐘運行一次命令

*/1 * * * * /home/linrui/XXXX.sh

四、每月的1號 14:10 運行

10 14 1 * * /home/linrui/XXXX.sh

Crontab命令的選項

如下是 crontab 的有效選項:

crontab –e : 修改 crontab 文件. 若是文件不存在會自動建立。 
crontab –l : 顯示 crontab 文件。 
crontab -r : 刪除 crontab 文件。
crontab -ir : 刪除 crontab 文件前提醒用戶。

 

ThinkPHP實現定時任務

項目服務端框架我選用的是ThinkPHP,因爲策劃案中有需求要定時刷新指定數據,因此在windows平臺我使用微軟的計劃任務調用bat腳原本執行下面的命令來完成

php index.php /Home/cli

即便用PHP的CLI模式調用ThinkPHP的入口文件,而後再傳入指定控制器完成相應的數據處理。/Home/cli 爲我新增的名爲CliController的控制器,在類中index方法調用相應處理數據的模塊便可。特別注意:在windows平臺上執行時在bat腳本中必定要先將當前執行目錄切換到index.php所在目錄,而後執行php.exe index.php /Home/cli.

在linux平臺下使用的crontab來實現定時任務,經過crontab -e 新增一條命令,具體寫法可問問度娘,給出個人配置截圖:

# m h dom mon dow command
0 6 * * */bin/sh /mnt/share/Web/Cli_timer.sh

效果就是天天早上6點執行cli_timer.sh腳本,腳本內容以下:

sh -c "cd /mnt/share/WebServer;php index.php /Home/Cli;"
這裏須要說明的是在linux下若是cli_timer.sh腳本中只包含下面命令
php index.php /Home/Cli;

是會報路徑包含錯誤的,因此這裏在腳本中將當前工做路徑切換到index.php腳本放置的目錄,這樣就能正常使用了。

 

ubuntu上使用cron執行定時任務計劃

在ubuntu下,cron爲自帶的系統服務。

任意用戶下,輸入「crontab -e」便可進入任務編寫。相關提示大體以下:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

若是是第一次執行「crontab -e」,會提示選擇編輯器,選擇合適的編輯器便可。我選擇的是「4」,vim。

Select an editor.  To change later, run 'select-editor'.  
  1. /bin/ed  
  2. /bin/nano        <---- easiest  
  3. /usr/bin/vim.basic  
  4. /usr/bin/vim.tiny  
  
Choose 1-4 [2]:   

而後,在最後面添加下面內容,而後保存並退出。

# test
3 * * * * date >>/tmp/test.txt

至於上面這個表達式的說明,請各看官自行度娘或谷歌。

 

好了,去看看「/tmp/test.txt」是否有內容吧。

 

下面是我期間遇到的幾個問題。

1.輸入「crontab -e」,提示「no crontab for root - using an empty one」

處理:這個是正常的,提示你,當前設定的用戶,沒有cron任務。

2.輸入「crontab -e」,輸入內容後,退出時,提示保存;保存後,任務不能成功添加。

處理:你選擇的編輯器有問題。請在root角色下輸入「select-editor」,能夠從新進行選擇。

3.編輯完任務並保存後,重啓服務的問題。

有些網文說是「service crond restart」進行服務重啓,在這裏,須要特別注意的是,在ubuntu下cron服務的重啓應該是「service cron restart 」。注意,是「cron」,而不是「crond」。

Ubuntu使用crontab定時任務

由於今天想定時執行postgres的一些腳本,因此在網上查一下有一個crontab的命令,就把這個命令的使用記錄一下,方便往後查找.

cron是一個[守護程序]用於在指定的時間內執行行程類的任務,每個用戶都有一個 crontab 文件,來容許他們指定須要執行的內容和時間,此外,系統也有一個 crontab ,用來容許像交替日誌和更新本地數據這樣有規則的任務。

環境:Ubuntn 12.10

1.使用 crontab -e命令

這個命令比較簡單直接輸入就能夠

#:crontab -e

出現以下窗口(第一次會提示你用那個編譯器,隨便選 一個就好了)

以後就能夠輸入你想執行的內容了.

好比:*/2 * * * * date >> /home/postgres/time.log 它的意思就是每過兩分鐘就向time.log文件中寫入固然的系統時間.

以後ctrl+X退出保存就好了.

2.保存crontab以後,咱們還要重啓crontab服務來使這個任務生效.

sudo service cron restart

3.看一下結果

vim /home/postgres/time.log

參數說明(我找的不少例子,看看就明白了.)

# m h  dom mon dow  command

m 分鐘 0-59

h 小時 0-23

dow 天1-31

mon 月 1-12

dow  星期 1-6  0表示星期天

command 就是要執行的命令

********************************************

ubuntu 使用sh 沒法執行腳本文件的解決方法

最近剛開始學習linux shell語言

看的是鳥哥的私房菜,裏面有講到執行shell腳本有兩種方法:

1. 設置執行屬性: chmod 755 file

執行(若是已經在當前目錄) :    ./file

2. 使用:  sh file 執行

.可是在vmware裏裝的ubuntu 11.10卻沒法執行

#!/bin/bash
declare -i s
for (( i = 1; i <= 100;i = i+1 ))
do 
    s=s+i
done
echo "The count is ==> $s"

使用第二種方法執行時出現 :

test04_for.sh: 1: declare: not found
test04_for.sh: 3: Syntax error: Bad for loop variable

 

百度了下網上,解決方法:

在終端中輸入:

sudo dpkg-reconfigure dash

而後出現的界面中選擇 NO

而後就能正確運行了。

**********************************************

 

Crontab中的除號(slash)到底怎麼用?

crontab 是Linux中配置定時任務的工具,在各類配置中,咱們常常會看到除號(Slash)的使用,那麼這個除號到底標示什麼意思,使用中有哪些須要注意的地方呢?
 
在定時任務中,咱們常常有這樣的需求,好比每5分鐘查看一下日誌,咱們能夠這麼寫:
 
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /command
 
這樣確定是沒有問題的,可是就寫書寫起來很是複雜,簡化一下能夠這麼寫:
 
0-55/5 * * * * /command
 
這樣的寫法已經簡化了不少,你們仍是以爲麻煩,那麼能夠這樣寫:
 
*/5 * * * * /command
 
怎麼樣,是否是很是簡單明瞭。這句就表示在0,5,10,15,20,25,30,35,40,45,50,55分鐘的時候執行命令,即每隔5分鐘執行命令。
 
由此咱們得出除號與範圍搭配使用,表示命令執行的步長。
 
那麼我下面這種寫法,是否標示每13分鐘執行一次命令呢?
 
*/13 * * * * /command
 
這裏就是須要注意的地方。有一些步長是沒法用這種方式表達的。只有可以被整除的步長值才能表達與咱們理解相一致確切的含義,對於分鐘來講只有 */2,*/3,*/4,*/5,*/6,*/10,*/12,*/15,*/30,對於小時來講則只有*/2,*/3,*/4,*/6,*/8,*/12。對於日期來講,若是使用*/5,則不能保證每5天執行一次,到月底的時候可能只執行1天、2天或3天后就中止了,這取決與大小月與平閏年。這是由於 cron 是沒有狀態的,它不可以記錄上次執行的是什麼時間,只能根據當前的時間來判斷是否須要執行。
 
而對於*/13這個例子來講,表示在分鐘這個範圍內,即0-59分鐘,任務會每13分鐘執行一次。即:0,13,26,39,52,以後再間隔8分鐘,就會又從新執行。
 
再看下面一個例子:
 
0 6 */2 * * /command 
 
看到這個咱們若是理解成每xx執行就是,每兩天的6點鐘執行命令。在這裏*的範圍是1-31,*/2表示任務在奇數天執行,那麼在一、三、五、七、八、十、12月,月末最後一天執行後,緊接着次日仍而後執行,那這就不是每2天執行一次。
相關文章
相關標籤/搜索