在 PuTTY 或终端关闭后保持进程运行

在 PuTTY 或终端关闭后保持进程运行

我正在运行一个Node.js服务器位于 Raspbian (Debian) 机器上,我想远程启动和停止服务器。这对我来说意味着使用油灰访问 shell,除非我关闭 PuTTY 终端或超时,否则我的服务器会随之关闭,因为我只是在前台执行我的服务器。

有没有办法让它继续下去,但之后仍然有办法终止进程?

答案1

我不了解 raspbian,但由于它源自 Debian,我认为 nohup 也将可用。而不是运行一个进程,

$  proc &

尝试使用:

$ nohup proc &

nohup 将防止进程在终端断开连接时终止。 HTH。

答案2

你的问题有点缺乏细节,所以我假设你的意思是你在 Pi 的控制台上键入了启动服务器的命令,并且它在前台执行。

如果是这种情况,您有五个选项,按实施的复杂性排序:

  1. 使用@f-塔塞尔的回答。由于您是 GNU/Linux 的新手,该&符号告诉 shell 它应该在后台执行该进程并立即返回到提示符,而不是通常执行的操作(即等待命令完成后再返回到提示)。从技术上讲,这称为将命令分叉到后台。

  2. 做你以前做过的事情,但要分阶段进行screen。基本上,这需要安装screensudo apt-get install screen在您的 Debian 系统上),然后在您键入命令启动服务器之前执行screen.这将打开一个新的 shell,您可以稍后重新连接到该 shell,即使您的 PuTTY 连接中断也是如此。所以它会表现得好像你从未断开过连接一样。

    如果您不熟悉screen,您可能需要阅读一些内容维基百科在联机帮助页中。您也可以使用 来完成同样的事情tmux

  3. 使用永远Node.js 模块。看https://stackoverflow.com/questions/4797050/how-to-run-process-as-background-and-never-die我从哪里得到这个的。

  4. 将您的服务器置于screen后台进程中。这意味着您将screen在后台创建一个新会话,但永远不会附加到它。并且,屏幕进程将运行您的服务器,而不是运行 shell。您将输入以下内容:

    screen -d -m exec_your_server --put-args-here
    

    如果您愿意,您可以在启动时运行它。基本上,您需要将 screen 命令放入文件/etc/rc.local或中/etc/rc.d/rc.local,我忘了是哪个了。如果您在执行此操作时遇到麻烦,请提出新问题。

    同样,你也可以这样做tmux

  5. 编写服务脚本。由于您使用的是 Debian 并且是新手,因此您可能正在使用 Debian 提供的默认设置init,即 System V Init。我从来没有看过 System V Init 的服务文件,只看过 systemd 和一点 Upstart,所以我在这里无法帮助你。如果你想继续这个问题,请提出一个新问题。

    恕我直言,这是最不“hacky”的方式,如果您长期运行服务器,您应该考虑这样做,因为您可以像系统上的其他服务一样通过诸如 等命令来管理它sudo service your_server stop。这种方式将在启动时自动启动您的服务器,并且您不需要,screen因为它也会在后台自动发生。

    它还会自动以 root 身份执行,这是危险的 - 您应该在服务器中放置逻辑,通过成为专门为服务器创建的非特权用户来放弃您拥有的特权。 (这是为了防止服务器受到损害 - 想象一下如果有人可以通过您的服务器以 root 身份运行东西!呃。这个问题谈论这个做得很好。)

答案3

使用主管如果你真的很认真的话。

运行二进制文件的基本方法如下:

$ nohup node app &
$ echo $! > node-instance.pid

然后当你想杀掉它的时候

$ kill `cat node-instance.pid`

但我会使用supervisord。它可以让你做很多奇特的事情。

答案4

如果您正在运行 bash shell,则可以选择使用该disown命令,该命令的结果与该nohup命令相同,只是它采用它找到的第一个正在运行的程序。例如 :

$ command &
$ disown

或者您可以创建一个脚本来分叉您的进程并杀死父亲,以便子进程由 init 继承。例如,这就是我对脚本所做的事情。它并不简单,但是当您启动它时,它会自动进入后台,并且如果您注销也不会终止。

另一个解决方案是创建一个服务文件并启用它,以便您可以使用简单的命令启动、停止、重新启动或执行任何操作。 (但我真的不知道 debian 是否正在使用 systemd,因为我使用的是 archlinux)

相关内容