在哪里可以找到所有正在运行的pm2应用程序的端口?

时间:2018-11-16 10:36:09

标签: node.js pm2

我有一台安装了PM2的服务器和10个正在运行的节点应用程序。每个应用程序都应使用不同的端口号运行。在服务器上安装新的应用程序时,我需要有关使用的端口的信息。 通过“ pm2 list”,我可以获得有关应用程序的更多信息,但没有端口信息。

/// <summary>
/// Executes command
/// </summary>
/// <param name="cmd">command to be executed</param>
/// <param name="output">output which application produced</param>
/// <param name="transferEnvVars">true - if retain PATH environment variable from executed command</param>
/// <returns>true if process exited with code 0</returns>
static bool ExecCmd(string cmd, out String output, bool transferEnvVars = false)
{
    ProcessStartInfo processInfo;
    Process process;

    if (transferEnvVars)
        cmd =  cmd + " && echo --VARS-- && set";

    processInfo = new ProcessStartInfo("cmd.exe", "/c " + cmd);
    processInfo.CreateNoWindow = true;
    processInfo.UseShellExecute = false;
    processInfo.RedirectStandardError = true;
    processInfo.RedirectStandardOutput = true;

    process = Process.Start(processInfo);

    // Executing long lasting operation in batch file will hang the process, as it will wait standard output / error pipes to be processed.
    // We process these pipes here asynchronously.
    StringBuilder so = new StringBuilder();
    process.OutputDataReceived += (sender, args) => { so.AppendLine(args.Data); };
    StringBuilder se = new StringBuilder();
    process.ErrorDataReceived += (sender, args) => { se.AppendLine(args.Data); };

    process.BeginOutputReadLine();
    process.BeginErrorReadLine();
    process.WaitForExit();

    output = so.ToString();
    String error = se.ToString();

    if (transferEnvVars)
    {
        Regex r = new Regex("--VARS--(.*)", RegexOptions.Singleline);
        var m = r.Match(output);
        if (m.Success)
        {
            output = r.Replace(output, "");

            foreach ( Match m2 in new Regex("(.*?)=([^\r]*)", RegexOptions.Multiline).Matches(m.Groups[1].ToString()) )
            {
                String key = m2.Groups[1].Value;
                String value = m2.Groups[2].Value;
                Environment.SetEnvironmentVariable(key, value);
            }
        }
    }

    if(error.Length != 0)
        output += error;
    int exitCode = process.ExitCode;

    if (exitCode != 0)
        Console.WriteLine("Error: " + output + "\r\n" + error);

    process.Close();
    return exitCode == 0;
}

我找不到所有已使用端口的概述,并且我不相信此重要信息不是PM2提供的。 有人知道我在哪里可以看到PM2中所有已用端口的列表吗?

3 个答案:

答案 0 :(得分:1)

嗨,Schmidko,即使我尝试了同样的方法,但我在pm2中也没有找到这样的选项 所以我目前正在从pm2 l获取pid,然后使用以下命令在我的linux操作系统上获取端口

sudo netstat -ano -p tcp | grep <PID>

所以我得到这样的输出: tcp6 0 0 ::: 1111 ::: *关闭2111 / app.js(0.00 / 0/0)

其中2111 / app.js是PID且::: 1111是端口

(在这里发表评论,因为我无权发表评论)

答案 1 :(得分:0)

使用ps aux | grep节点。并手动匹配pid。

答案 2 :(得分:0)

是的,这对pm2恕我直言有点失败。仅当您在服务器上运行多个实例(站点)时。 我使用:

ss -tnlp | grep node

然后您可以查看pm2和端口上的pid,或者在我的情况下,您仅获得其运行目录的摘录。