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

Spe*_*cer 70 ssh session services sysvinit

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

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

F. *_*ell 56

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

$  proc &
Run Code Online (Sandbox Code Playgroud)

尝试使用:

$ nohup proc &
Run Code Online (Sandbox Code Playgroud)

当终端断开连接时, nohup 将阻止进程终止。哈。


str*_*gee 50

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

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

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

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

    如果您不熟悉screen,您可能需要阅读维基百科联机帮助页。您也可以使用tmux.

  3. 使用永远的node.js 模块。请参阅/sf/ask/335793531/了解我从哪里得到这个。

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

    screen -d -m exec_your_server --put-args-here
    
    Run Code Online (Sandbox Code Playgroud)

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

    同样,你也可以这样做tmux

  5. 编写服务脚本。由于您使用的是 Debian 并且是新手,您大概使用的init是 Debian 提供的默认设置,即 System V Init。我从来没有看过 System V Init 的服务文件,只有 systemd 和一个小新贵,所以我在这里帮不了你。如果您想继续这个问题,请提出一个新问题。

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

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


onu*_*gör 8

如果您真的很认真,请使用supervisord

这样做以运行二进制文件的基本方法:

$ nohup node app &
$ echo $! > node-instance.pid
Run Code Online (Sandbox Code Playgroud)

然后,当你想杀死它时,

$ kill `cat node-instance.pid`
Run Code Online (Sandbox Code Playgroud)

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


Dep*_*ado 7

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

$ command &
$ disown
Run Code Online (Sandbox Code Playgroud)

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

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