【问题标题】:how to keep nohup from killing java process that waits for stdin linux如何防止nohup杀死等待stdin linux的java进程
【发布时间】:2015-07-31 00:34:19
【问题描述】:

我有一个在命令行 (Bash Linux) 上执行的 java 程序。一旦执行,程序将继续运行,读取标准输入,直到用户输入“退出”。

有时我想nohup 程序,这样即使我的远程连接关闭,它也能继续运行。问题是,当我尝试如下所示对程序进行 nohup 时,似乎它对 stdin 的提示会杀死 nohup 并终止程序。

示例:$ nohup java -jar myApp.jar

我已尝试根据其他建议将程序的输出重定向到 2>/dev/null,并使用 & 在后台运行它。两者都不能防止 nohup 被杀死。

我不能使用 disown,因为一旦我运行该程序,我就会失去该程序的命令提示符。

【问题讨论】:

  • 有什么理由不使用tmuxscreen 代替吗?你也许可以通过这种方式回避这个问题。
  • @MaximillianLaumeister 谢谢,我实际上并不熟悉这些。我目前都没有安装。我想我会得到屏幕并试一试。
  • 我个人会推荐tmux,因为在我看来它比screen 更易于使用。如果你给我一分钟,我会写一个答案,告诉你如何使用它。

标签: java linux bash


【解决方案1】:

要让您的程序在后台运行,请运行tmux

tmux

这将打开一个 tmux shell,您可以在其中运行您的程序:

java -jar myApp.jar

然后要从 tmux 会话中分离,请键入 ctrl-b,然后键入 d。您的程序将继续在后台运行。

要稍后重新附加到程序的 shell(杀死它或查看它的输出),请运行 tmux attach

【讨论】:

    【解决方案2】:

    虽然 tmux 解决了我的问题,但我一直在玩弄 disown 直到我让它发挥作用。我能够在注销后通过管道传输超长 sleep 命令(在 this thread 中建议)保持 Java 进程运行,在后台运行它,然后运行 ​​disown强>。像这样:

    $ 睡眠 999999999 | java -jar myApp.jar&

    $拒绝

    所以,我会坚持使用 tmux,但我只是想我会分享这个,因为它对我的问题也很有效。

    【讨论】: