我想运行一个.jar文件,所以我所做的就是放“&”在命令的最后(实际上没有必要记录输出,我只希望能够从托管我的java程序的远程服务器断开连接,程序本身在完成后保存结果)
我按照以下方式执行,但它不会在后台运行,它让我等待:
java -Xmx72G -cp //home/arian/rapidminer/lib/rapidminer.jar com.rapidminer.RapidMinerCommandLine -f //home/arian/RMRepository/testRemote.rmp &
知道为什么它不起作用?
谢谢, 阿里安
答案 0 :(得分:2)
你是什么意思"它让我等着#34;? RapidMinerCommandLine
是否有机会从stdin
或其他信息流中读取?
如果你想在后台运行一个进程和断开与tty会话的连接,你应该使用nohup
,例如:
nohup java -Xmx.... com.rapidminer.RapidMinerCommandLine &
(请记住最后的&
!)
您可以在... 1> /dev/null
之前添加&
,以忽略所有stdout
。
您还可以考虑screen
实用程序,该实用程序允许您断开并重新连接到会话,但这对于(半)交互式会话更有用。
(另外,你指定了相当大的最大堆大小?)
干杯,
答案 1 :(得分: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
答案 2 :(得分:2)
我不知道为什么它不起作用。在大多数炮弹中它确实应该。
无论如何,如果您打算断开连接,通常会发现只是将作业放在后台是不够的:断开连接将关闭控制台(这将打破许多程序,单独)并发送一个SIGHUP信号(这将导致任何程序退出)。
您应该考虑使用nohup
来运行程序(使用&
)。或者,如果您确实需要稍后返回并与该计划进行互动,那么screen
或byobu
可能更适合该法案。另一种选择可能是将任务添加到crontab
。
答案 3 :(得分: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.
希望它能解决你的问题。