2015-04-23 16 views
3

我有一個正在執行jar文件的crontab shell腳本。 Jar文件正在將文件從一臺服務器移動到另一臺服務器。在高峯時間,需要超過10分鐘(超過crontab條目)。安排cron項目以便僅在尚未運行的情況下運行腳本

如何確保cron作業在最後一個作業沒有完成之前不會執行?

+0

請確定您正在使用的操作系統(和版本)(Ubuntu,其他Linux,Mac,Window)? –

+0

什麼是命令行,你想在你的crontab中輸入 –

回答

5

一個簡單的方法是讓你的Cron啓動一個bashfile來檢查這個過程是否存在。

的cron:

*/10 * * * * /path/to/bashscript.sh 

(請確保它具有正確的用戶和可執行)

pgrep命令查找與給定名稱的過程,並返回的ProcessID時,這樣一個過程被發現。

#!/bin/bash 
# bashscript.sh  

pID=$(pgrep -n "yourjarfile") 

# Check if jarfile is running 
if $pID > /dev/null 
then  
    #log something to syslog 
    logger $pID "already running. not restarting." 
else 
    # start jar file 
    /usr/bin/java -jar /path/to/yourjarfile.jar 
fi 

- 編輯 -

由F. Hauri的回答(這順便說一句,做工精細)的啓發,我想出了一個較短的版本:

*/10 * * * * pgrep -n "yourjarfile." || /usr/bin/java -jar /path/to/yourjarfile.jar 
1

Crontab無法控制腳本執行以達到您想要的效果,您必須使用其他方法。我能想到的更簡單的方法是創建和監視包含執行任務狀態的文件。首先在與調用Java的bash腳本相同的目錄下創建一個控制文件:$ echo 0> javaisrun.txt

在此之後,您可以擁有自己的腳本來檢查Java是否正在運行,並將其佔用響應做類似:

#!/bin/bash 

A=$(cat javaisrun.txt) 

if [ $A = 1 ]; then 
echo Java is running already 
else 
echo Not Running, start Java 
echo 1 > javaisrun.txt 
java -jar temp3.jar 
echo Java job is done, restoring state file 
echo 0 > javaisrun.txt 
fi 

腳本將讀取「javaisrun.txt」文件,以它的價值,並決定繼續與Java或沒有做文件上的更新,而Java正在執行和執行之後。

0

我使用的方法與羅德里戈的答案類似,但也將信號量清理降級爲cron。例如:

* * * * * cd workdir; S=<a lockfile name>; touch $S; myjob jobparams; rm $S 

這樣,如果某種程度上作業崩潰或有人殺死它,cron將負責移除鎖定文件。這不是萬無一失的,但對我來說運作良好。

3

可以使用窮人的鎖文件直接在cron條目中,例如:

* * * * * LOCKFILE=whatever; [ ! -f $LOCKFILE ] && (touch $LOCKFILE && /path/to/java javaargs ; rm $LOCKFILE)

1

我用一段時間這種伎倆:

*/10 * * * * ps -C javaws www| grep -q mytool.jar || javaws ... mytool.jar 

不是很性感,但效率更高。

+0

請注意,可能需要'/ path/to/files-or-binaries'。 –

+0

你爲什麼低調呢? –

相關問題