0

我想运行一个 .jar 文件,所以我所做的就是在命令的最后加上“&”(实际上不需要记录输出,我只想能够断开与主机的远程服务器的连接)我的java程序,程序本身完成后保存结果)

我按照以下方式进行操作,但它不在后台运行,它让我等待:

java -Xmx72G -cp //home/arian/rapidminer/lib/rapidminer.jar com.rapidminer.RapidMinerCommandLine -f //home/arian/RMRepository/testRemote.rmp &

知道为什么它不起作用吗?

谢谢,阿里安

4

4 回答 4

2

“它让我等待”是什么意思?是否RapidMinerCommandLine有机会从stdin其他流中读取?

如果你想在后台运行一个进程断开你应该使用的 tty 会话nohup,例如:

nohup java -Xmx.... com.rapidminer.RapidMinerCommandLine &

(记得&最后!)

您可以在忽略所有... 1> /dev/null之前添加。&stdout

您还可以考虑使用该screen实用程序,它允许您断开和重新连接到会话,但这对(半)交互式会话更有用。

(另外,你指定的最大堆大小相当大?)

干杯,

于 2012-11-19T09:53:02.680 回答
2

您可以使用 JSVC,这是一个用于守护 Java 应用程序的实用程序

http://commons.apache.org/daemon/jsvc.html

它会给你一个 var pid 文件,对于创建一个真正的启动/停止脚本很有用。

编辑:其他解决方案,也许可以帮助

这是我在嵌入式系统上为 Slackware Linux 完成的一个非常古老的启动/停止脚本:

#!/bin/sh

application_start() {
  cd /usr/local/YOURHOME
  /usr/lib/java/bin/java \
        -Xmx72G \
        -classpath //home/arian/rapidminer/lib/rapidminer.jar \
        com.rapidminer.RapidMinerCommandLine \
        -f //home/arian/RMRepository/testRemote.rmp &
  echo -n "Starting App daemon:  $CMDLINE"
  ps -Ao pid,command | grep java | grep com.rapidminer.RapidMinerCommandLine | awk '{print $1}' > /var/run/app.pid
  echo
}

application_stop() {
  echo -n "Stopping DataBaseSynchronizerClient daemon..."
  kill `cat /var/run/DataBaseSynchronizerClient.pid`
  echo
  sleep 1
  rm -f /var/run/DataBaseSynchronizerClient.pid
  killall DataBaseSynchronizerClient 2> /dev/null
}

application_restart() {
  application_stop
  sleep 1
  application_start
}

case "$1" in
'start')
  application_start
  ;;
'stop')
  application_stop
  ;;
'restart')
  application_restart
  ;;
*)
  echo "usage $0 start|stop|restart"
esac
于 2012-11-19T09:55:25.350 回答
2

我不知道为什么它不起作用。在大多数贝壳中,它确实应该。

无论如何,如果您打算断开连接,您通常会发现仅将作业置于后台是不够的:断开连接将关闭控制台(这将单独破坏许多程序)并发送 SIGHUP 信号(这将导致大约任何要退出的程序)。

您应该考虑使用nohup来运行程序(使用&)。或者,如果您确实需要稍后返回并与该程序进行交互,screen或者byobu可能更符合要求。另一种选择可能是将任务添加到您的crontab.

于 2012-11-19T09:57:00.827 回答
1

我同意它应该按原样工作,但我在后台运行 Java 时也遇到了问题。我的解决方案是使用该screen实用程序(通常安装在大多数 Linux 发行版中),您可以在其中打开可以分离的 shell。如果我记得很清楚,命令是这样的(但也有一个很好的联机帮助页)

screen -S myCustomName # runs a new shell called myCustomName
CTRL + D # detach from the current screen instance
screen -ls # list active screen instances
screen -r myCustomName # reattach to the screen instance.

希望它能解决你的问题。

于 2012-11-19T10:43:16.553 回答