ubuntu 下執行定時任務


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

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

[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, 看看, 果然是文件格式問題, 那怎么解決呢?

 

 

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

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

     方法三:直接執行dos2unix a.sh來轉化, 然后就可以執行./a.sh運行腳本了。(我的linux上執行dos2unix ./a.sh失敗, 但是不要放棄啊, 加個busybox就可以了), 如下:

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了。   第三種方法最方便, 建議用第三種!

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

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

 

入門

# 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 示例

1、在 凌晨00:01運行

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

2、每個工作日23:59都進行備份作業。

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

或者如下寫法:

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

3、每分鍾運行一次命令

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

4、每個月的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表示任務在奇數天執行,那么在1、3、5、7、8、10、12月,月末最后一天執行后,緊接着第二天仍然后執行,那這就不是每2天執行一次。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM