简短回答:您应该重定向标准输入、输出和错误pm2
过程:
pm2 log < /dev/null > /dev/null 2>&1 &
这将防止远程 ssh 服务器在 pm2 退出之前保持会话打开。
更长的答案:
ssh user@mysever <<'HEREDOC'
...
pm2 log &
当你跑步时ssh
通过这种方式,远程 ssh 服务器将启动远程用户 shell 的副本来处理会话。为了中继远程会话的输入和输出,远程 ssh 服务器将分配一个 TTY 或一组管道。然后它将 TTY 或管道设置为 shell 进程的标准输入、输出和错误。
因此,在远程系统上,您有一个 TTY 或一组管道将远程 shell 进程连接到 SSH 服务器进程。 shell 调用的任何命令都将继承 TTY 或管道集作为命令的标准输入等(除非您使用 shell 功能来重定向标准文件句柄)。
您可能认为 ssh 服务器会在远程 shell 进程退出时终止会话。但事实并非如此。当 ssh 服务器在 TTY 或连接到会话标准输出的管道上读取文件结束条件时,它会终止会话。
在你的情况下,你正在调用这个pm2
远程系统上的命令,并且它继承了远程会话的标准输出。只要该程序正在运行,远程 ssh 服务器就不会在标准输出管道上收到 EOF,也不会终止会话。
解决方法是重定向输入pm2
进程,因此它不会继承连接到 ssh 服务器的标准句柄:
pm2 log < /dev/null > /dev/null 2>&1 &
如果您想捕获输出,可以重定向到文件而不是 /dev/null。我认为只有标准输出重定向是绝对必要的,但为了确定起见,您也应该重定向标准输入和错误。