带屏幕的异步shell命令

时间:2014-11-15 09:30:35

标签: linux shell ant

我正在尝试使用ant + scp在远程服务器上执行脚本。

远程服务器上的脚本非常简单,它启动了一个用java编写的游戏服务器:

game_server.sh:

java -Xms500M -Xmx500M -jar game.jar

ant build.xml:

<?xml version="1.0" ?>
<project default="restart_game_server" name="server"> 
    <target name="restart_game_server"> 
        <sshexec host="x.x.x.x" username="root" password="xxx" command="cd xxx; ./game_server.sh" trust="true" />
    </target>
</project>

当我在终端(mac os)中运行命令“ant”时,远程服务器上的game_server.sh成功执行但问题是:

“ant”命令被阻止,因为“game_server.sh”永远不会返回。

我试图通过在“屏幕”中启动“game_server”来解决这个问题,但我无法弄清楚如何在shell脚本中执行此操作,我尝试了类似的方法:

# kill the game sever first
fuser -k -n tcp 9988
# resume the last screen or start a new one
screen -R
# move to the folder where the script is located
cd xxxx
# run script
./game_server.sh

但我不知道如何使用shell命令而不是键盘退出屏幕(c + a + d)

任何建议都将不胜感激,谢谢:)

编辑:

尝试使用“&amp;”方式,但仍然被阻止。

这是ant命令输出,你可以看到它是如何被阻止的:

root: ant
Buildfile: build.xml

restart_game_server:
  [sshexec] Connecting to x.x.x.x.x:22
  [sshexec] cmd : fuser -k -n tcp 9988; cd xxxxx; ./game_server.sh &
  [sshexec] 9988/tcp:         
  [sshexec]  12729
  [sshexec]   
  [sshexec] game sever log
  [sshexec] game sever log
  [sshexec] game sever log
  [sshexec] game sever log
  [sshexec] game sever log
  [sshexec] game sever log
  .......
  BLOCKED !!!!!

2 个答案:

答案 0 :(得分:1)

您可以尝试在后台运行game_server.sh,而不使用屏幕:

./game_server.sh &

或者,您可以尝试更改build.xml,如下所示:

<?xml version="1.0" ?>
<project default="restart_game_server" name="server"> 
    <target name="restart_game_server"> 
        <sshexec host="x.x.x.x" username="root" password="xxx" command="cd xxx; ./game_server.sh &" trust="true" />
    </target>
</project>

答案 1 :(得分:0)

使用screen -d -m以分离模式运行屏幕。

有关详细信息,请参阅man page