2012-11-19 35 views
0

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

我这样做,但它不会在后台运行,它让我等待:

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

的任何想法,为什么它不工作?

感谢, 阿里安

+2

不知道它是什么样的应用程序,但-Xmx72G是相当多的内存! –

+0

是的,这是一个数据挖掘软件,它已经使用12GB的简单流程 –

+1

如果您对开始/停止脚本感兴趣,我已经编辑了我的答案。这将是interresting与其他答案混合(nohup)。 –

回答

2

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

如果你想在后台断开从tty会话应该使用nohup,例如:

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

运行一个进程(请记住&末!)

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

您也可以考虑screen实用程序,该实用程序允许您拆除和重新连接到会话,但对于(半)交互式会话更有用。

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

干杯,

+0

我的意思是它阻止我, 谢谢 –

+0

你有从@ams的原因和解决方案。我已经添加了一个关于如何将'stdout'指向位桶的简介,你可以看看它是否适合你。干杯。 –

2

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

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

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

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

这是一个很老的开始/嵌入式系统停止脚本我已经为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 
+0

我没有安装东西的权限 –

2

我不知道它为什么不将无法工作。它确实应该在大部分炮弹中。

无论如何,如果你打算断开连接,你通常会发现仅仅把工作放在后台是不够的:断开连接将关闭控制台(这将单独打破许多程序)并发送一个SIGHUP信号将导致几乎任何程序退出)。

您应该考虑使用nohup来运行程序(使用&)。或者,如果您以后需要返回并与该计划进行交互,那么screenbyobu可能更适合该账单。另一种选择可能是将任务添加到crontab

+0

其实当我使用nohup时,它仍然挡住我! ' [1] 12623 user @ Server:〜$ nohup:忽略输入并将输出追加到'nohup.out' ' –

+3

您没有被封锁。提示后出现一条消息,就是这样。尝试打入和几次。 – ams

+0

谢谢!它现在有效! :) –

1

我同意它应该照原样运行,但我在后台运行的Java也遇到了问题。我的解决方案是使用screen实用程序(通常安装在大多数Linux发行版中),您可以在其中打开一个可从中脱离的外壳。如果我没记错的话这些命令是这样的(但也有一个很好的手册页)

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. 

希望它能解决您的问题。