台灣最大程式設計社群網站
線上人數
1231
 
會員總數:246145
討論主題:189731
歡迎您免費加入會員
討論區列表 >> Linux / Unix >> 如何在crontab 執行shell script ?
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
如何在crontab 執行shell script ?
價值 : 10 QP  點閱數:7191 回應數:10
樓主

uniojnqoifazy
門外漢
0 98
1094 146
發送站內信

各位大大,
我想要在crontab中排程定時執行一支shell script

test.sh :

export PATH=/bin:/sbin:/usr/bin:/usr/sbin

test1=$(route)

echo "$test1" > aaa.txt

echo "#`date`" >> aaa.txt


我以root的身份執行crontab -e ,加入下面這行在下午一點38分時執行

38 13 * * * /home/pinky/test.sh

可是如果有執行的話,應該會新增資料在aaa.txt,可是卻沒有執行這支test.sh,請問是那裡錯了嗎??


本篇文章發表於2012-08-08 14:12
1樓
回應

神來之筆
捐贈 VP 給 神來之筆 檢舉此回應
直接執行 /home/pinky/test.sh 可以跑?
本篇文章回覆於2012-08-08 15:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

uniojnqoifazy
檢舉此回應
直接執行是可以跑的,路徑沒有錯
本篇文章回覆於2012-08-08 15:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

uniojnqoifazy
檢舉此回應
也具有執行屬性

-rwxr-xr-x 1 root root 120 Aug 8 14:53 /home/pinky/test.sh
本篇文章回覆於2012-08-08 15:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
請/bin/bash /home/pinky/test.sh
或/bin/sh /home/pinky/test.sh
這樣子試試
我是蠻習慣執行的程式都加上絕對路徑,雖然明明已經有加上export PATH了...

另外...
test.sh最好加上cd /home/pinky
進入使用者目錄後再做檔案的輸出輸入
或者是輸出輸入在特定的位置,比如 /tmp或其它之類的
本篇文章回覆於2012-08-10 17:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

uniojnqoifazy
檢舉此回應
原來是有成功的,只是aaa.txt產生在root的目錄裡。
但是我試另一個shell script,但是在17:9時卻沒有執行,但是如果是直接執行是可以執行的
#sh /root/backup.sh


可是在crontab中卻沒有執行,請問各位大大是那裡錯了嗎?

backup.sh

export PATH=/bin:/sbin:/usr/bin:/usr/sbin

source /root/.bash_profile
sudo /opt/shop/bin/clean_pSB_db.pl \
--mysqldump-opts="--skip-lock-tables" --dbtype=employee --maxdays=3 \
--owmesh-dir=/opt/shop/etc/ \
--dumpdir=/var/log/BACKUP/employee




crontab 的設定:

9 17 * * * /bin/sh /root/backup.sh




# pwd backup.sh
/root

# ls -l /root/backup.sh
-rwxr-xr-x 1 root root 287 Aug 17 17:06 /root/backup.sh

本篇文章回覆於2012-08-17 17:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
最有價值解答

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
sudo /opt/shop/bin/clean_pSB_db.pl
應該不需要再sudo吧??

pl是用perl去執行,跟sh一樣,加上執行檔的路徑吧?
/usr/bin/perl /opt/shop/bin/clean_pSB_db.pl
本篇文章回覆於2012-08-18 13:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

uniojnqoifazy
檢舉此回應
那顆爛蔥 ,
改成/usr/bin/perl /opt/shop/bin/clean_pSB_db.pl ,還是一樣在crontab中沒有執行



export PATH=/bin:/sbin:/usr/bin:/usr/sbin

source /root/.bash_profile
/usr/bin/perl /opt/shop/bin/clean_pSB_db.pl \
--mysqldump-opts="--skip-lock-tables" --dbtype=employee --maxdays=3 \
--owmesh-dir=/opt/shop/etc/ \
--dumpdir=/var/log/BACKUP/employee
本篇文章回覆於2012-08-18 15:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

那顆爛蔥
捐贈 VP 給 那顆爛蔥 檢舉此回應
那個pl檔,有引用其它的檔案嗎??
它應該還是有使用其它外部程式吧?
一般透過crontable執行,最麻煩的就是權限跟路徑...
權限設完執行的帳號後,最好用whereis查一下所有需要的執行檔






不然...看看crontable的Log吧??預設應該都會有記錄...
本篇文章回覆於2012-08-19 10:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

uniojnqoifazy
檢舉此回應
crontab的log 是有執行
(root) CMD (sh /root/backup.sh)


本篇文章回覆於2012-08-22 11:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
你 shell script的第一行 最好寫明是用什麼 shell去執行
#!/bin/bash

同樣的 perl的第一行 最好也寫明 perl的路徑
#!/usr/local/bin/perl2.6

否則 crontab執行環境裡 沒有你現在的 $PATH env資料
誰會知道要去哪裡找 perl來幫你跑 .pl script

否則 你就直接指名要在哪個路徑下用哪個perl去跑這個 .pl script
就像前面 爛蔥兄 提的 在.sh前指名 bash路徑


你確定你知道sudo的作用?
你知道 沒人可以在cron環境下輸入密碼嗎?
本篇文章回覆於2012-09-29 13:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.