我有一台安装了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中所有已用端口的列表吗?
答案 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,或者在我的情况下,您仅获得其运行目录的摘录。