我有一個正在執行jar文件的crontab
shell腳本。 Jar文件正在將文件從一臺服務器移動到另一臺服務器。在高峯時間,需要超過10分鐘(超過crontab
條目)。安排cron項目以便僅在尚未運行的情況下運行腳本
如何確保cron
作業在最後一個作業沒有完成之前不會執行?
我有一個正在執行jar文件的crontab
shell腳本。 Jar文件正在將文件從一臺服務器移動到另一臺服務器。在高峯時間,需要超過10分鐘(超過crontab
條目)。安排cron項目以便僅在尚未運行的情況下運行腳本
如何確保cron
作業在最後一個作業沒有完成之前不會執行?
一個簡單的方法是讓你的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
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正在執行和執行之後。
我使用的方法與羅德里戈的答案類似,但也將信號量清理降級爲cron。例如:
* * * * * cd workdir; S=<a lockfile name>; touch $S; myjob jobparams; rm $S
這樣,如果某種程度上作業崩潰或有人殺死它,cron將負責移除鎖定文件。這不是萬無一失的,但對我來說運作良好。
可以使用窮人的鎖文件直接在cron條目中,例如:
* * * * * LOCKFILE=whatever; [ ! -f $LOCKFILE ] && (touch $LOCKFILE && /path/to/java javaargs ; rm $LOCKFILE)
我用一段時間這種伎倆:
*/10 * * * * ps -C javaws www| grep -q mytool.jar || javaws ... mytool.jar
不是很性感,但效率更高。
請注意,可能需要'/ path/to/files-or-binaries'。 –
你爲什麼低調呢? –
請確定您正在使用的操作系統(和版本)(Ubuntu,其他Linux,Mac,Window)? –
什麼是命令行,你想在你的crontab中輸入 –