㈠ linux定時執行任務的shell腳本
linux下使用crontab命令被用來提交和管理用戶的需要周期性執行的任務,示例如下:
crontab -e 編輯周期任務
30 21 * * * /etc/init.d/smb restart 每晚的21:30重啟smb
crontab命令說明:
crontab命令被用來提交和管理用戶的需要周期性執行的任務,與windows下的計劃任務類似,當安裝完成操作系統後,默認會安裝此服務工具,並且會自動啟動crond進程,crond進程每分鍾會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。
語法
crontab(選項)(參數)
選項
-e:編輯該用戶的計時器設置;
-l:列出該用戶的計時器設置;
-r:刪除該用戶的計時器設置;
-u<用戶名稱>:指定要設定計時器的用戶名稱。
參數
crontab文件:指定包含待執行任務的crontab文件。
知識擴展
Linux下的任務調度分為兩類:系統任務調度和用戶任務調度。
系統任務調度:系統周期性所要執行的工作,比如寫緩存數據到硬碟、日誌清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。
crontab文件的含義:
用戶所建立的crontab文件中,每一行都代表一項任務,每行的每個欄位代表一項設置,它的格式共分為六個欄位,前五段是時間設定段,第六段是要執行的命令段,格式如下:
minute hour day month week command 順序:分 時 日 月 周
其中:
minute: 表示分鍾,可以是從0到59之間的任何整數。
hour:表示小時,可以是從0到23之間的任何整數。
day:表示日期,可以是從1到31之間的任何整數。
month:表示月份,可以是從1到12之間的任何整數。
week:表示星期幾,可以是從0到7之間的任何整數,這里的0或7代表星期日。
command:要執行的命令,可以是系統命令,也可以是自己編寫的腳本文件。
在以上各個欄位中,還可以使用以下特殊字元:
星號(*):代表所有可能的值,例如month欄位如果是星號,則表示在滿足其它欄位的制約條件後每月都執行該命令操作。
逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,「1,2,5,7,8,9」
中杠(-):可以用整數之間的中杠表示一個整數范圍,例如「2-6」表示「2,3,4,5,6」
正斜線(/):可以用正斜線指定時間的間隔頻率,例如「0-23/2」表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute欄位,表示每十分鍾執行一次。
㈡ 如何設置PowerShell腳本定時執行
不管是Windows還是Mac OS還是Linux,凡是定時執行的,一般都是靠計劃任務。
以在Windows中運行Powershell腳本為例:
寫好你的腳本,比如叫a.ps1
創建定時任務,在動作頁設置:
運行程序powershell,參數
-FileX:..a.ps1-ExecutionPolicyByPas
其餘項根據你的需求設置好,到設定的時間就可以運行了。
P.S. 不要把運行時間設在過去。
㈢ linux定時任務調用shell時腳本中的存儲過程不執行
1、被執行的腳本沒有執行許可權,這種情況 直接授權
chmod 755 xxx.sh
2、被執行的腳本編碼有問題,這種情況直接轉碼
dos2unix xxx.sh
我們也可下載一個windows版的dos2unix,轉完碼後再上傳到Linux伺服器
補充:linux定時任務
每天早上6點
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意單純echo,從屏幕上看不到任何輸出,因為cron把任何輸出都email到root的信箱了。
每兩個小時
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上11點到早上8點之間每兩個小時和早上八點
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點
0 11 4 * 1-3 command line
1月1日早上4點
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出現錯誤,或者有數據輸出,數據作為郵件發給這個帳號 HOME=/
每小時執行/etc/cron.hourly內的腳本
01 * * * * root run-parts /etc/cron.hourly
每天執行/etc/cron.daily內的腳本
02 4 * * * root run-parts /etc/cron.daily
每星期執行/etc/cron.weekly內的腳本
22 4 * * 0 root run-parts /etc/cron.weekly
crontab許可權問題到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在
用法如下:1、如果兩個文件都不存在,則只有root用戶才能使用crontab命令。
2、如果cron.allow存在但cron.deny不存在,則只有列在cron.allow文件里的用戶才能使用crontab命令,如果root用戶也不在裡面,則root用戶也不能使用crontab。
3、如果cron.allow不存在, cron.deny存在,則只有列在cron.deny文件裡面的用戶不能使用crontab命令,其它用戶都能使用。
4、如果兩個文件都存在,則列在cron.allow文件中而且沒有列在cron.deny中的用戶可以使用crontab,如果兩個文件中都有同一個用戶,
以cron.allow文件裡面是否有該用戶為准,如果cron.allow中有該用戶,則可以使用crontab命令
㈣ unix下不使用crontab實現定時執行shell腳本
shell腳本後台運行,可以用& 來實現.
㈤ shell腳本編寫定時器
root用戶在/root 目錄創建下面腳本test_print.sh
#!/bin/bash
#腳本名:test_print.sh
#作用:測試,給所有在線的終端列印'現在9點了'
ttys=`w|awk'{print$2}'|sed-n'3,$p'`#截取在線終端
foriin$ttys
do
echo'現在9點了'>/dev/$i#echo列印信息
done
執行此行,追加到crond任務
echo"09***sh/root/test_print.sh">>/var/spool/cron/root
㈥ shell腳本可以直接執行,計劃任務不執行 為什麼
linux計劃任務是使用crontab命令,不執行一般原因如下:
cronjob的格式不正確,解決方式為按正確格式重寫cron命令
執行文件沒有x執行許可權,解決方式為使用chmod添加執行許可權
執行文件的路徑不正常,解決方式為使用完整的路徑,不使用相對路徑
磁碟空間不足,解決方式為清理磁碟空間
解決建議:
把執行程序的log重定向到某個日誌文件中,查看log文件內容是分析原因。
㈦ 在linux下怎麼讓一個腳本定時運行
Linux中,周期執行的任務一般由cron這個守護進程來處理 ps -ef | grep cron
cron讀取一個或多個配置文件,這些配置文件中包含了命令行及其調用時間。
cron的配置文件稱為「crontab」,是「cron table」的簡寫。
一、 cron在3個地方查找配置文件(設置shell腳本):
1、/var/spool/cron/yanggang 這個目錄下存放的是每個用戶(包括root)的crontab任務,每個任務以創建者的名字命名,比如用戶tom建的crontab任務對應的文件就是/var/spool/cron/tom
yanggang@barry$ sudo ls -l /var/spool/cron/(或有時是 /var/spool/cron/crontabs/)
-rw------- 1 root crontab 1071 2011-09-19 17:20 root
-rw------- 1 yanggang crontab 1176 2011-09-24 11:07 yanggang
一般一個用戶最多隻有一個crontab文件(如:root, yanggang等),其對應日誌在/var/spool/mail/root(或/var/spool/mail/yanggang)文件里
2、/etc/crontab 這個文件負責安排由系統管理員制定的維護系統以及其他任務的crontab。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR
#sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
例如:
*/5 * * * * root /usr/libexec/atrun
minute:代表一小時內的第幾分,范圍 0-59。
hour:代表一天中的第幾小時,范圍 0-23。
mday:代表一個月中的第幾天,范圍 1-31。
month:代表一年中第幾個月,范圍 1-12。
wday:代表星期幾,范圍 0-7 (0及7都是星期天)。
who:要使用什麼身份執行該指令,當您使用 crontab -e 時,不必加此欄位。
command:所要執行的指令。
3、/etc/cron.d/ 這個目錄用來存放任何要執行的crontab文件或腳本。
二、 許可權
crontab許可權問題到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在
用法如下:
1、如果兩個文件都不存在,則只有root用戶才能使用crontab命令。
2、如果cron.allow存在但cron.deny不存在,則只有列在cron.allow文件里的用戶才能使用crontab命令,如果root用戶也不在裡面,則root用戶也不能使用crontab。
3、如果cron.allow不存在, cron.deny存在,則只有列在cron.deny文件裡面的用戶不能使用crontab命令,其它用戶都能使用。
4、如果兩個文件都存在,則列在cron.allow文件中而且沒有列在cron.deny中的用戶可以使用crontab,如果兩個文件中都有同一個用戶,
以cron.allow文件裡面是否有該用戶為准,如果cron.allow中有該用戶,則可以使用crontab命令。
AIX 中 普通用戶默認都有 crontab 許可權,如果要限制用戶使用 crontab ,就需要編輯/var/adm/cron/cron.deny
HP-UNIX 中默認普通用戶沒得crontab 許可權 ,要想放開普通用戶的crontab 許可權可以編
三、 創建cron腳本
第一步:寫cron腳本文件,命名為crontest.cron。
15,30,45,59 * * * * echo "xgmtest....." >> xgmtest.txt 表示,每隔15分鍾,執行列印一次命令
第二步:添加定時任務。執行命令 「crontab crontest.cron」。搞定
第三步:"crontab -l" 查看定時任務是否成功或者檢測/var/spool/cron下是否生成對應cron腳本
四、 cron服務
cron是一個linux下 的定時執行工具,可以在無需人工干預的情況下運行作業。
/sbin/service crond start //啟動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重啟服務
/sbin/service crond reload //重新載入配置
/sbin/service crond status //查看服務狀態
例如: 使用sudo停止與啟動服務
yanggang@barry$sudo service cron stop
cron stop/waiting
yanggang@barry$ sudo service cron start
cron start/running, process 7502
五、 crontab用法
crontab命令用於安裝、刪除或者列出用於驅動cron後台進程的表格,用戶把需要執行的命令序列放到crontab文件中以獲得執行。
每個用戶都可以有自己的crontab文件,/var/spool/cron下的crontab文件不可以直接創建或者直接修改,該crontab文件是通過crontab -e命令創建的
在crontab文件中如何輸入需要執行的命令和時間,該文件中每行都包括六個域,其中前五個域是指定命令被執行的時間,最後一個域是要被執行的命令。
每個域之間使用空格或者製表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday)
除了數字還有幾個個特殊的符號就是"*"、"/"與"-"、",",*代表所有的取值范圍內的數字
"/"代表每的意思,"/5"表示每5個單位,"-"代表從某個數字到某個數字,","分開幾個離散的數字。
-l 在標准輸出上顯示當前的crontab。
-r 刪除當前的crontab文件。
-e 使用VISUAL或者EDITOR環境變數所指的編輯器編輯當前的crontab文件。
當結束編輯離開時,編輯後的文件將自動安裝。
幾個例子:
每天早上6點
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意單純echo,從屏幕上看不到任何輸出,因為cron把任何輸出都email到root的信箱了。
每兩個小時
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上11點到早上8點之間每兩個小時和早上八點
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點
0 11 4 * 1-3 command line
1月1日早上4點
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出現錯誤,或者有數據輸出,數據作為郵件發給這個帳號 HOME=/
每小時(第一分鍾)執行/etc/cron.hourly內的腳本
01 * * * * root run-parts /etc/cron.hourly
每天(凌晨4:02)執行/etc/cron.daily內的腳本
02 4 * * * root run-parts /etc/cron.daily
每星期(周日凌晨4:22)執行/etc/cron.weekly內的腳本
22 4 * * 0 root run-parts /etc/cron.weekly
每月(1號凌晨4:42)去執行/etc/cron.monthly內的腳本
42 4 1 * * root run-parts /etc/cron.monthly
注意: "run-parts"這個參數了,如果去掉這個參數的話,後面就可以寫要運行的某個腳本名,而不是文件夾名。
每天的下午4點、5點、6點的5 min、15 min、25 min、35 min、45 min、55 min時執行命令。
5,15,25,35,45,55 16,17,18 * * * command
每周一,三,五的下午3:00系統進入維護狀態,重新啟動系統。
00 15 * *1,3,5 shutdown -r +5
每小時的10分,40分執行用戶目錄下的innd/bbslin這個指令:
10,40 * * * * innd/bbslink
每小時的1分執行用戶目錄下的bin/account這個指令:
1 * * * * bin/account
每天早晨三點二十分執行用戶目錄下如下所示的兩個指令(每個指令以;分隔):
203 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st)
每年的一月和四月,4號到9號的3點12分和3點55分執行/bin/rm -f expire.1st這個指令,並把結果添加在mm.txt這個文件之後(mm.txt文件位於用戶自己的目錄位置)。
12,553 4-91,4 * /bin/rm -f expire.1st$#@62;$#@62;mm.txt
六、幾個問題
crond 進程沒有運行
1. 啟動crond進程
/etc/init.d/crond start
2. 開機自啟動crond進程
chkconfig crond on
crontab 編輯:
輸入編輯命令: crontab -e
# m h dom mon dow command
SHELL=/bin/bash
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh
Ctrl + O (寫入)——》enter鍵(保存文件名)——》Ctrl + X(退出)
輸入查看命令: crontab -l
# m h dom mon dow command
SHELL=/bin/bash
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh(建議使用此方式)
語法錯誤:
Syntax error: "(" unexpected
路徑錯誤:
在 /var/spool/crontab/yanggang 中,添加了如下命令,在日誌文件 /var/spool/mail/yanggang 中提示找不到 xxx.sh 路徑
30 * * * * /home/barry/top800/top10/top10_fruits/top10_all.sh
或
30 * * * * bash /home/barry/top800/top10/top10_fruits/top10_all.sh
這是因為在crontab中使用了絕對路徑執行腳本 top10_all.sh,因此在腳本 top10_all.sh 中引用的其它腳本也都需要使用絕對路徑,才能被crontab找到並執行
如何避免絕對路徑復雜的設置呢,如上文 六、幾個問題 所示,採用如下格式:
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh(建議使用此方式,先進入該目錄,然後在執行腳本;否則,執行腳本中的其它腳本都需要加絕對路徑)
㈧ 在linux下怎麼讓一個腳本定時運行
Linux中,周期執行的任務一般由cron這個守護進程來處理 ps -ef | grep cron
cron讀取一個或多個配置文件,這些配置文件中包含了命令行及其調用時間。
cron的配置文件稱為「crontab」,是「cron table」的簡寫。
㈨ shell腳本手動執行無問題,放在計劃任務裡面就不正常了,請大神指教!
腳本中的環境變數 env > env.log 打出為:
1 HOME=/home/kk
2 OLDPWD=/home/kk
3 LOGNAME=kk
4 PATH=/usr/bin:/bin
5 SHELL=/bin/sh
6 PWD=/home/kk/weibo/a
明顯是很多不同的, 而且PATH少了很多設置。
因此想辦法在shell腳本的開頭加上這些東西:
1 #!/bin/bash
2 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
3 SHELL=/bin/bash
4 JAVA_HOME=/usr/lib/jvm/java-6-sun
5 _=/usr/bin/env
6
7
8 env > env.log
9 . /etc/profile
10 . ~/.profile
shit! 結果還是失敗!!!
解決辦法: ==========================================》
方法一:
在/etc/crontab 文件中直接添加我的crontab job任務即可。 但是此法需要root許可權才能修改此文件, 在我的本機是可以的;但是我在伺服器上面就是不可以了,沒有root許可權。
方法二:
在crontab -e 中的頭部加上PATH, 該PATH和命令行下env得到的PATH一樣。
me@server:~/$ crontab -l
# m h dom mon dow command
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
㈩ 求助一個shell腳本定時執行的問題
每分鍾執行一次的話是不需要加上"/1」的,並且echo輸出的值也不會在當前窗口輸出的。你想測試的話你可以把那個命令換成sleep 100,時間到了之後你再執行 ps aux |grep sleep 就能判斷出有沒有執行了。
[root@localhost aa]# ps aux |grep sleep
root 17142 0.0 0.1 1668 388 ? Ss 03:52 0:00 sleep 100
root 17149 0.0 0.2 5028 660 pts/2 R+ 03:53 0:00 grep sleep