linux下crontab定時執行本地腳本和定時訪問指定url


http://www.cnblogs.com/intval/p/5763929.html

https://my.oschina.net/u/2487410/blog/683308

http://www.cnblogs.com/maybo/p/5183753.html

使用linux curl命令講解:http://www.linuxdiyf.com/linux/2800.html

[root@jiangbo ~]# crontab -e
crontab: installing new crontab
You have new mail in /var/spool/mail/root
[root@jiangbo ~]# crontab -l
*/1 * * * * /usr/bin/curl http://localhost/xiaochu/openApi/calCrown.php
You have new mail in /var/spool/mail/root
[root@jiangbo ~]# crontab -e
crontab: installing new crontab
You have new mail in /var/spool/mail/root
[root@jiangbo ~]# crontab -l
0 0 * * * /usr/bin/curl http://localhost/xiaochu/openApi/calCrown.php
[root@jiangbo ~]#

crontab: installing new crontab
[root@jiangbo ~]# crontab -l
*/1 * * * * /usr/bin/curl -s http://localhost/xiaochu/openApi/calCrown.php >> /var/www/html/crownlog.txt 2>&1
[root@jiangbo ~]#

 

把php輸出重定向到 crownlog.txt中 >>為追加模式 >為清空模式

*/1 * * * * /usr/bin/curl -s http://localhost/xiaochu/openApi/calCrown.php >> /var/www/html/crownlog.txt 2>&1

curl -s/--slient 減少輸出的信息,比如進度

關於 >/dev/null 2>&1 的解釋:

0表示鍵盤輸入

1表示標准輸出

2表示錯誤輸出.

我們首先創建test.sh腳本如下:

#! /bin/sh

echo "hello, everybody, now is " `date`

date >> test.txt

然后添加作業

* * * * * /home/oracle/test.sh >/home/oracle/log.txt & 默認值為1,即和下面命令一致

* * * * * /home/oracle/test.sh 1>/home/oracle/log.txt &

* * * * * /home/oracle/test.sh 2>/home/oracle/log.txt &

* * * * * /home/oracle/test.sh 2>/home/oracle/log.txt 2>&1 &

1,2將tesh.sh 命令輸出重定向到log.txt, 即輸出內容不打印到屏幕上,而是輸出到log.txt文件中。如果你需要追加而不是覆蓋,可以用 >>代替>

2>&1 是將錯誤輸出重定向到標准輸出。 然后將標准輸入重定向到文件log.txt。

&1 表示的是文件描述1,表示標准輸出,如果這里少了&就成了數字1,就表示重定向到文件1。

 

 

shell中可能經常能看到:>/dev/null 2>&1 

命令的結果可以通過%>的形式來定義輸出 

/dev/null 代表空設備文件 
> 代表重定向到哪里,例如:echo "123" > /home/123.txt 
1 表示stdout標准輸出,系統默認值是1,所以">/dev/null"等同於"1>/dev/null" 
2 表示stderr標准錯誤 
& 表示等同於的意思,2>&1,表示2的輸出重定向等同於1 

那么本文標題的語句: 
1>/dev/null 首先表示標准輸出重定向到空設備文件,也就是不輸出任何信息到終端,說白了就是不顯示任何信息。 
2>&1 接着,標准錯誤輸出重定向等同於 標准輸出,因為之前標准輸出已經重定向到了空設備文件,所以標准錯誤輸出也重定向到空設備文件。 
A. 1> /dev/null 表示將命令的標准輸出重定向到 /dev/null2>/dev/null 表示將命令的錯誤輸出重定向到 /dev/null1 - denotes stdout ( standard output )2 - denotes stderr  ( standard error )/dev/null就相當與windows里的回收站,只是進去了不能再出來了。>/dev/null 就是將標准輸出和標准出錯的信息屏蔽不顯示 
B.>/dev/null 2>&1   also can write  as  1>/dev/null 2>&1     - stdout redirect to /dev/null (no stdout) ,and redirect stderr to stdout  (stderr gone as well) . end up it turns both stderr and stdout off 
C.a little practice may help to undstand above .  #ls /usr  /nothing #ls /usr  /nothing  2>/dev/null #ls /usr  /nothing  >/dev/null 2>&1 

我們經常會在UNIX系統下的一些腳本中看到類似”2>&1″這樣的用法,例如“/path/to/prog 2>&1 > /dev/null &”,那么它的具體含義是什么呢? 
  UNIX有幾種輸入輸出流,它們分別與幾個數字有如下的對應關系:0-標准輸入流(stdin),1-標准輸出流(stdout),2-標准錯誤流 (stderr)。”2>&1″的意思就是將stderr重定向至stdout,並一起在屏幕上顯示出來。如果不加數字,那么默認的重定向動作是針對stdout(1)的,比如”ls -l > result”就等價於”ls -l 1 > result”。這樣便於我們更普遍性的理解重定向過程。 
  下面舉例說明: 
#cat std.sh 
#!/bin/sh 
echo “stdout” 
echo “stderr” >&2 

#/bin/sh std.sh 2>&1 > /dev/null 
stderr 

#/bin/sh std.sh > /dev/null 2>&1 

  第一條命令的輸出結果是stderr,因為stdout和stderr合並后一同重定向到/dev/null,但stderr並未被清除,因此仍將在屏幕中顯示出來;第二條命令無輸出,因為當stdout重定向至/dev/null后,stderr又重定向到了stdout,這樣stderr也被輸出到了/dev/null。 

 

5.使用實例

實例1:每1分鍾執行一次command
命令:
* * * * * command 或者*/1 * * * * command

如果是每五分鍾執行一次可改為:
*/5 * * * * /home/dbbackup/db2backup.sh backup

實例2:每小時的第3和第15分鍾執行
命令:
3,15 * * * * command

實例3:在上午8點到11點的第3和第15分鍾執行
命令:
3,15 8-11 * * * command

實例4:每隔兩天的上午8點到11點的第3和第15分鍾執行
命令:
3,15 8-11 */2 * * command

實例5:每個星期一的上午8點到11點的第3和第15分鍾執行
命令:
3,15 8-11 * * 1 command

實例6:每晚的21:30重啟smb 
命令:
30 21 * * * /etc/init.d/smb restart


實例7:每月1、10、22日的4 : 45重啟smb 
命令:
45 4 1,10,22 * * /etc/init.d/smb restart


實例8:每周六、周日的1 : 10重啟smb
命令:
10 1 * * 6,0 /etc/init.d/smb restart


實例9:每天18 : 00至23 : 00之間每隔30分鍾重啟smb 
命令:
0,30 18-23 * * * /etc/init.d/smb restart


實例10:每星期六的晚上11 : 00 pm重啟smb 
命令:
0 23 * * 6 /etc/init.d/smb restart


實例11:每一小時重啟smb 
命令:
* */1 * * * /etc/init.d/smb restart


實例12:晚上11點到早上7點之間,每隔一小時重啟smb 
命令:
* 23-7/1 * * * /etc/init.d/smb restart

實例13:每月的4號與每周一到周三的11點重啟smb 
命令:
0 11 4 * mon-wed /etc/init.d/smb restart

實例14:一月一號的4點重啟smb 
命令:
0 4 1 jan * /etc/init.d/smb restart


實例15:每小時執行/etc/cron.hourly目錄內的腳本
命令:
01 * * * * root run-parts /etc/cron.hourly

實例16:如何設定crontab在每月最后一天執行一種方法:
for Linux
 0 8 28-31 * * [ `date -d tomorrow +\%e` -eq 1 ] && (shell script)
 for other Unix,BSD
 0 8 28-31 * * [ `echo \`cal\` | awk '{print $NF}'` -eq 1 ] && (shell script)

 

 `date -d tomorrow +\%e` 這是一句命令,返回幾號
[ x -eq 1]x號數與1比較是否相等
其中的\應該是轉義字符,

 

0 0 * * * /usr/bin/curl -s http://localhost/xiaochu/openApi/calCrown.php >> /var/www/html/crownlog.txt 2>&1 每天0點0分執行
59 23 * * * /usr/bin/curl -s http://www.k7wan.com/studio.php?action=updatestudiodata&type=d >> /var/www/pttuicd/studio.txt 2>&1 每天23點59分執行

//每月執行不好使,所以改成在php里判斷是不是最后一天
0 22 28-31 * * [`date -d tomorrow +\%e` -eq 1]&& /usr/bin/curl -s http://www.k7wan.com/studio.php?action=updatestudiodata&type=m >> /var/www/pttuicd/studio.txt 2>&1 每月28-31號 最后一天 22點0分執行

 

另一種方法:
 單獨靠crontab判斷比較復雜,所以把判斷部分寫到執行腳本中
#!/bin/bash
 today=`date +%d`
 last_day=`cal | xargs | awk '{print $NF}'`
 if [ "$today" != "$last_day" ];then   
  exit 1
 fi
 ....  # other codes start from here

 

   通過腳本實現的:
crontab里設定一條:
0 12 28-31 * * sh /tmp/start.sh
start.sh 腳本如下:
******************************************************************************
#!/usr/bin/ksh
#this script is used to start the xxx in the last day of every month
ym=`date +%m" "%Y`
if [ `date +%d` = `cal $ym|xargs|awk '{print $NF}'` ]
then
sh yourscripts
fi
********************************************************************************


免責聲明!

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



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