如果进程已经运行,终止bash脚本
我使用启动脚本通过Centmin上的webmin启动我们的Minecraft服务器。它在启动服务器之前备份一些文件。最近我们连续两次意外地执行了脚本,导致我们的数据混乱,导致运行Minecraft服务器的两个实例,并且所有内容都随着数据文件等而变得混乱。如果进程已经运行,终止bash脚本
为了防止发生这种情况,我希望脚本在检测到进程正在运行时终止。我已经搜索过类似的问题,并且建议使用锁文件,但我没有机会删除这些文件,因为启动脚本只设置了Minecraft服务器进程的屏幕,并且通常通过停止服务器来完成终止屏幕或通过游戏命令停止服务器。
服务器进程正在使用此命令启动:
screen -dmS minecraft java -Xincgc -Xmx2G -jar server.jar
我怎样才能让启动脚本检测此进程已在运行,然后自行终止?
使用该脚本:
#!/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 $?
,并启动你的屏幕中。
这些链接可以给你一些想法:http://mywiki.wooledge.org/ProcessManagement - http://mywiki.wooledge.org/BashFAQ/042 - http://mywiki.wooledge.org/BashFAQ/033 - http://mywiki.wooledge.org/BashFAQ/045
你能总结一下这些链接中的内容吗? – chrisaycock 2012-01-01 20:32:13
创建锁的方式是错误的,因为它不是原子,必须用'mkdir',看到:HTTP:// mywiki。 wooledge.org/BashFAQ/045 – 2012-01-01 20:29:20
“屏幕”会话中是否需要设置“陷阱”?我认为你需要从脚本内部删除'screen -dmS minecraft',然后这个脚本就会被调用,就像'screen -dmS minecraft minecraft-script.sh'一样。没有? – ruakh 2012-01-01 20:50:29
Samus_的lock dir建议似乎不起作用。我实现了目录检查,但它似乎在完成启动屏幕后立即终止。 – Clavus 2012-01-01 20:59:52