【问题标题】:Running a process in background, linux ubuntu在后台运行一个进程,linux ubuntu
【发布时间】:2012-11-19 09:20:23
【问题描述】:

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

我按照它做的,但它不在后台运行,它让我等待:

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

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

谢谢, 阿里安

【问题讨论】:

  • 不知道它是什么类型的应用,但是-Xmx72G 是相当多的内存!
  • 是的,它是一个数据挖掘软件,一个简单的过程已经使用了12GB
  • 如果您对启动/停止脚本感兴趣,我已经编辑了我的答案。与其他答案(nohup)混合会很有趣。

标签: java linux shell ubuntu background


【解决方案1】:

我不知道为什么它不起作用。在大多数 shell 中确实应该这样做。

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

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

【讨论】:

  • 实际上当我使用 nohup 时,它仍然会阻止我! ` [1] 12623 user@Server:~$ nohup: 忽略输入并将输出附加到nohup.out'
  • 你没有被屏蔽。提示后出现一条消息,仅此而已。尝试按回车几次。
  • NP,这就是后台任务的问题:它们的输出都与前台进程混淆了。
【解决方案2】:

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

如果您想在后台运行进程并断开与 tty 会话的连接,您应该使用nohup,例如:

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

(请记住最后的&!)

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

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

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

干杯,

【讨论】:

  • 您有来自@ams 的原因和解决方案。我添加了一个关于如何将stdout 定向到比特桶的简介,你可以看看它是否适合你。干杯。
【解决方案3】:

您可以使用 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

【讨论】:

  • 我没有权限安装东西
【解决方案4】:

我同意它应该按原样工作,但我在后台运行 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.

希望它能解决你的问题。

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多