2012-01-01 96 views
0

我使用啓動腳本通過Centmin上的webmin啓動我們的Minecraft服務器。它在啓動服務器之前備份一些文件。最近我們連續兩次意外地執行了腳本,導致我們的數據混亂,導致運行Minecraft服務器的兩個實例,並且所有內容都隨着數據文件等而變得混亂。如果進程已經運行,終止bash腳本

爲了防止發生這種情況,我希望腳本在檢測到進程正在運行時終止。我已經搜索過類似的問題,並且建議使用鎖文件,但我沒有機會刪除這些文件,因爲啓動腳本只設置了Minecraft服務器進程的屏幕,並且通常通過停止服務器來完成終止屏幕或通過遊戲命令停止服務器。

服務器進程正在使用此命令啓動:

screen -dmS minecraft java -Xincgc -Xmx2G -jar server.jar 

我怎樣才能讓啓動腳本檢測此進程已在運行,然後自行終止?

回答

3

使用該腳本:

#!/bin/bash 
LOCKDIR="/path/to/lockdir" 

if [ ! mkdir "$LOCKDIR" ]; then 
    echo >&2 "Server is already running" 
    exit 1 
fi 

# Here: when exiting, or receiving any of the mentioned signals, remove the lock file    
trap "rmdir \"$LOCKDIR\"" exit INT HUP TERM QUIT 
  
# It would be tempting to exec instead, but DON'T DO IT: otherwise the trap is forgotten 
minecraft java -Xincgc -Xmx2G -jar server.jar 

exit $? 

,並啓動你的屏幕中。

+2

創建鎖的方式是錯誤的,因爲它不是原子,必須用'mkdir',看到:HTTP:// mywiki。 wooledge.org/BashFAQ/045 – 2012-01-01 20:29:20

+0

「屏幕」會話中是否需要設置「陷阱」?我認爲你需要從腳本內部刪除'screen -dmS minecraft',然後這個腳本就會被調用,就像'screen -dmS minecraft minecraft-script.sh'一樣。沒有? – ruakh 2012-01-01 20:50:29

+0

Samus_的lock dir建議似乎不起作用。我實現了目錄檢查,但它似乎在完成啓動屏幕後立即終止。 – Clavus 2012-01-01 20:59:52