![如何使用批处理文件将命令传递给正在运行的 Java 应用程序](https://linux22.com/image/1358851/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E5%B0%86%E5%91%BD%E4%BB%A4%E4%BC%A0%E9%80%92%E7%BB%99%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%20Java%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F.png)
这可能看起来有点基础和简单,但我以前从未这样做过。
我有这个 minecraft 服务器,它启动时会包含一个批处理文件:
java -Xms1012M -Xmx1012M -jar craftbukkit-1.5.1-R0.1.jar -o true
PAUSE
现在我只想创建一个停止服务器的批处理。在 cmd 中,我只需输入 stop,服务器就会停止。我如何将此命令传递给正在运行的 java 应用程序。
一些伪代码:
java craftbukkit-1.5.1-R0.1.jar stop
我真的不知道。我搜索了互联网但我只找到关于制作 start.bat 的教程。
带有教程的链接也会让我高兴。只是我找不到涵盖此内容的优质教程。
现在我找到了这个适用于Linux的脚本:
#!/bin/bash
# Made by Devils Child.
##############################################################
DIRECTORY='/home/minecraft'
SESSIONNAME='minecraftserverscreen'
JARFILE='craftbukkit.jar'
WORLDNAME='world'
NETHERNAME='world_nether'
SKYNAME='world_skylands'
ENDNAME='world_the_end'
##############################################################
start()
{
SCREENID=$(screen -ls | grep -w $SESSIONNAME | cut -f 2)
if [ $SCREENID ]; then
echo "Minecraft is already running."
else
echo "Starting Minecraft server..."
screen -dmS $SESSIONNAME java -Xms768M -Xmx768M -jar $JARFILE nogui
fi
}
stop()
{
SCREENID=$(screen -ls | grep -w $SESSIONNAME | cut -f 2)
if [ $SCREENID ]; then
echo "Stopping Minecraft server..."
screen -S $SESSIONNAME -p 0 -X stuff "`printf "stop\r"`"
while screen -ls | grep $SESSIONNAME > /dev/null
do
sleep 0.1
done
else
echo "Minecraft is not running."
fi
}
restart()
{
echo "Restarting Minecraft server..."
stop > /dev/null && start > /dev/null
}
saveoff()
{
screen -S $SESSIONNAME -p 0 -X eval 'stuff "say Starting backup..."\015'
screen -S $SESSIONNAME -p 0 -X eval 'stuff "save-off"\015'
screen -S $SESSIONNAME -p 0 -X eval 'stuff "save-all"\015'
sync
}
saveon()
{
screen -S $SESSIONNAME -p 0 -X eval 'stuff "save-on"\015'
screen -S $SESSIONNAME -p 0 -X eval 'stuff "say Backup complete."\015'
}
backup()
{
echo "Creating backup of '$WORLDNAME', '$NETHERNAME', '$SKYNAME' and '$ENDNAME'..."
saveoff
sleep 5
mkdir -p backups
tar cfv "backups/NEW.tar" $WORLDNAME $NETHERNAME $SKYNAME $ENDNAME > /dev/null
mv "backups/NEW.tar" "backups/$(date +"%m-%d-%Y_%H.%M.%S").tar"
saveon
}
restore()
{
echo "Restoring '$WORLDNAME', '$NETHERNAME', '$SKYNAME' and '$ENDNAME'..."
stop > /dev/null
rm -r $WORLDNAME
rm -r $NETHERNAME
rm -r $SKYNAME
rm -r $ENDNAME
tar xfv "backups/$(ls backups -t | head -1 | grep ".tar")" > /dev/null
start > /dev/null
}
cd $DIRECTORY
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
backup)
backup
;;
restore)
restore
;;
*)
echo "Usage: ${0} {start|stop|restart|backup|restore}"
exit 2
esac
exit 0
但是我的服务器运行的是 WindowsXP 机器,那么有没有办法在 Windows 中执行上述操作?我不知道。
答案1
我找到了一种使用 AutoHotkey 来实现此目的的方法:
步骤1:下载->自动热键
第 2 步:安装->autohotkey.exe
步骤3:编写此脚本并调用它(stop.ahk):
SetTitleMatchMode, 2 ; mode 2 = title only needs to contain string to match
SetKeyDelay, 0 ; set key delay to minimal
#WinActivateForce ; automatically use more forceful methods
IfWinExist, run-minecraft ; check if there is a cmd window with this title
{ ; send the commands
ControlSend, ,say Server will shutdown in 10 seconds, run-minecraft
ControlSend, ,{enter}
sleep, 9999
ControlSend, ,stop, run-minecraft
ControlSend, ,{Enter}, run-minecraft
return
}
步骤 4:放在title run-minecraft
start.bat 前面
第五步:左键单击(stop.ahk)并选择编译脚本
步骤 6:使用 Windows 任务管理器运行应用程序
答案2
如果你只是想终止该进程,你可以在 bash 脚本中执行如下操作:
ps -ef | grep java | awk '{print$2}' | xargs -i kill {}
您可能希望用更具体的标识符替换“java”。
如果您想更优雅地停止该过程,则必须实现类似套接字侦听器的功能。在这种情况下,您可以创建一个简单的客户端应用程序,通过端口向正在运行的应用程序发送一条消息,告诉它自行关闭。有关更多信息,请参阅本教程。
答案3
Taskkill 应该可以解决问题,请参阅http://technet.microsoft.com/en-us/library/bb491009.aspx。但我认为棘手的部分是找出要终止哪个 java 进程,我认为 jps 可能会有所帮助。更多信息请点击此处http://yannickloriot.com/2012/08/kill-a-java-process-from-the-command-line-or-a-bat-file/#sthash.t36Ff6C8.dpbs