需要用到Shell腳本每隔3秒鍾去監控一個軟件進程的運行狀態,發現crond似乎只支持到分,不知道秒,怎么辦呢?
第一種方法:
當然首先想到的是寫一個觸發的腳本,在觸發腳本中使用死循環來解決此問題,如下:
cat kick.sh
#!/bin/bash while : ;do /home/somedir/scripts.sh 2>/dev/null & sleep 3 done
注意第一次運行時請不要使用 bash kick.sh & 這種后台運行的方式,它會僵死的。
可以把它放到計划任務使其運行,然后將計划任務中的此條目刪除即可。最后把這個腳本放到 /etc/rc.local 讓它每次開機都可以被運行。
第二種方法:
和第一種方法類似,只不過感覺比第一種更便捷一些。
cat cron-seconds.sh
#!/bin/bash #For excuting the scripts every 3 seconds in crond. #20100124.WXG for((i=1;i<=20;i++));do /home/somedir/scripts.sh 2>/dev/null & sleep 3 done
然后寫入的crontab里每分鍾執行一次,如下
crontab -e
* * * * * /bin/bash /home/somedir/cron-seconds.sh
第三種方法:
那么如何使用計划任務來直接實現呢?
最后解決方案如下,經驗證,腳本運行非常穩定。
crontab -e
## For excuting scripts.sh every 3 seconds##on 2014-10-15 */1 * * * * /home/somedir/scripts.sh */1 * * * * sleep 3 && /home/somedir/scripts.sh */1 * * * * sleep 6 && /home/somedir/scripts.sh */1 * * * * sleep 9 && /home/somedir/scripts.sh */1 * * * * sleep 12 && /home/somedir/scripts.sh */1 * * * * sleep 15 && /home/somedir/scripts.sh */1 * * * * sleep 18 && /home/somedir/scripts.sh */1 * * * * sleep 21 && /home/somedir/scripts.sh */1 * * * * sleep 24 && /home/somedir/scripts.sh */1 * * * * sleep 27 && /home/somedir/scripts.sh */1 * * * * sleep 30 && /home/somedir/scripts.sh */1 * * * * sleep 33 && /home/somedir/scripts.sh */1 * * * * sleep 36 && /home/somedir/scripts.sh */1 * * * * sleep 39 && /home/somedir/scripts.sh */1 * * * * sleep 42 && /home/somedir/scripts.sh */1 * * * * sleep 45 && /home/somedir/scripts.sh */1 * * * * sleep 48 && /home/somedir/scripts.sh */1 * * * * sleep 51 && /home/somedir/scripts.sh */1 * * * * sleep 54 && /home/somedir/scripts.sh */1 * * * * sleep 57 && /home/somedir/scripts.sh #-----------------------------------------------------------------
他的思路是:先每隔1秒鍾觸發定時任務,然后又休眠 3秒、6秒、9秒等間隔 來執行具體的Shell腳本。
我還是比較傾向於使用第三種方法的。因為第一種方法和第二種方法並不是嚴格的間隔3秒執行的,會大於3秒,因為執行scripts.sh也是需要一定時間的,即使已經加了&符號放到了后台執行也會存在一定的誤差。如果對於精確度要求不高,推薦使用第二種方法。
工作中的一次用 PHP腳本每隔3秒鍾去監控一個Memcached代理服務器Magent的運行狀態
crontab -e
#-----------------------------------------------------------------
*/1 * * * * /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 3 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 6 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 9 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 12 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 15 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 18 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 21 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 24 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 27 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 30 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 33 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 36 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 39 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 42 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 45 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 48 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 51 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 54 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
*/1 * * * * sleep 57 && /usr/local/php/bin/php /usr/local/nginx/www/MemcachedMagent/index.php 172.16.8.81 >/dev/null 2>&1
#-----------------------------------------------------------------
--> 一般計划任務的問題大部分是出在環境變量上面, 要么就寫絕對路徑,要么就在腳本的開頭加載/etc/profile,如 下條命令行沒有被成功執行
00 01 * * * php /usr/local/nginx/www/sjf/crontab.php production Daemon delInvalidFans >/dev/null 2>&1
延伸閱讀:
