启动后台进程的正确方法

启动后台进程的正确方法

我只是想在 ssh 会话中的远程计算机上启动基本的 node.js 服务器。这似乎有效:

nohup node server/server.js &  disown

也许我不需要nohup?启动不会被 SIGTERM 等杀死的后台进程的“官方”方法是什么?我只想启动一个后台进程,然后退出会话并让该进程继续运行。

答案1

screen当然tmux可以,但它们适用于您想要断开连接并重新连接的交互式会话(通常在远程计算机上)。由于您的应用程序似乎是某种服务器,我建议将其作为系统服务运行(通常称为“守护进程“) 反而。

在下文中,我假设您使用的系统是系统。您需要做的就是在以下位置创建一个单元文件/etc/systemd/system/foo.service

[Unit]
Description=My foo service
After=network.target

[Service]
ExecStart=/usr/bin/node /absolute/path/to/your/server.js
Restart=always
User=nobody

[Install]
WantedBy=multi-user.target

如果您的服务需要访问磁盘上的文件,请根据需要修改用户。服务文件就位后,运行以下命令来要求 systemd 重新加载其配置文件并运行您的服务:

$ sudo systemctl daemon-reload
$ sudo systemctl start foo.service

您想在系统启动时自动启动它吗?只需启用它即可:

$ sudo systemctl enable foo.service

遇到问题?您可以使用以下命令进行故障排除:

$ systemctl status foo.service
$ journalctl -u foo.service

关于您关于防止服务被终止/终止的要求:我想说这至少非常困难。即使您的用户无权终止您的应用程序,您的系统也可能会耗尽 RAM,并且内存不足杀手可能会决定终止您的服务,因为它恰好是使用 RAM 最频繁的服务。我的建议是使用Restart=always上面示例中包含的内容,以确保 systemd 在崩溃/退出时重新启动服务。

答案2

您可以使用 screen 命令保存终端会话,以便以后访问。这使您不必终止可能附加到终端会话的进程。因此,如果您要开始大量数据传输,这就是一个有用的例子。您可以启动屏幕会话,开始传输数据,回家并通过 ssh 返回工作计算机,然后访问屏幕会话,而不会中断传输

要安装它:

sudo apt install screen 适用于 Ubuntu 或 Ubuntu 变体

yum install screenRedhat 或 Redhat 变体

然后你可以运行

screen -S <screen name>创建新的屏幕会话

screen -ls列出屏幕会话

screen -r <screen name>附加到特定屏幕。

tmux 正在慢慢取代 screen 命令,所以我建议也研究一下。

答案3

只是为了完整性和后代添加最简单/明显的答案(这里唯一的区别是关闭stdin,否则与问题中的示例相同,包括重定向标准输出/标准输入句法):

(1) 如果您不关心 stderr 和 stdout:

$ nohup {prog} </dev/null >/dev/null 2>&1 &  

(2) 如果你想记录 stderr 和 stdout,

$ nohup {prog} </dev/null >/path/to/out.log 2>&1 &  

(3) 如果要将 stderr 和 stdout 记录到单独的文件中,

$ nohup {prog} </dev/null >/path/to/out.log 2>/path/to/err.log &

如果你想保留日志,请旋转日志;这些示例将在每次启动时覆盖。可以选择使用日期命名日志,例如,out-$(date '+%Y-%m-%d-%H:%M:%S').log一旦您开始沿着该路径走下去,但是,正如其他答案所示,最好配置一项服务,让系统为您完成工作。我确实喜欢screen/ tmux,但前提是我正在调试一个我想最终实际重新连接终端的进程。否则,我更喜欢后台进程和日志记录。

相关内容