【问题标题】:How to kill Apache / PHP server running on local host port 8080?如何杀死在本地主机端口 8080 上运行的 Apache / PHP 服务器?
【发布时间】:2019-02-12 00:20:43
【问题描述】:

我目前正在运行 macOS High Sierra 版本 10.13.6。

这是我在浏览器中加载 localhost:8080 时得到的结果: Apache / PHP server screenshot

我不知道这个服务器是如何在这个端口上启动的,因为我从未使用过这些技术。我时不时地搞乱网络开发,但我不知道服务器启动时我在做什么。我已经研究了如何终止该进程,到目前为止,我最接近结束服务器的是终止我的 chrome 浏览器。我试图找到在 8080 端口上运行的进程的一些事情:

ps aux | grep 8080
lsof -t -i @localhost:8080
netstat -l -p | grep 8080
lsof -nP -i | grep 8080

我尝试了其他一些看起来相似的,但我记不起所有的了。使用 lsof 命令时,我通常必须将 sudo 放在它们前面才能显示任何内容。有时我会一无所获,有时我会得到类似这样的信息:Terminal output from lsofps aux output where the Postgres processes are

当我得到与它们关联的 PID 的进程时,我会尝试使用 kill -9 <PID> 杀死它们。通常我必须用 sudo 强制执行此操作,因为它给了我一个权限被拒绝错误(可能不是最佳实践)。当我这样做时,除了在我杀死最初的进程后搜索时出现了其他进程之外,似乎什么都没有发生。我还尝试从 ps aux 结束与 Postgres 相关的进程,但这也不起作用。似乎我发现的任何过程都不是正确的。有没有人有任何建议可以帮助我找到并终止托管服务器的进程?

【问题讨论】:

  • 您运行的是什么操作系统和版本?
  • macOS High Sierra 版本 10.13.6

标签: php bash apache unix port


【解决方案1】:

从命令行可以:

sudo /usr/sbin/apachectl stop

为了防止它在下次重新启动时启动:

sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist

请注意,我不知道你的系统上还有什么使用 apache,所以这可能会破坏一些东西。

【讨论】:

  • 这是我尝试 top 命令时得到的结果:/System/Library/LaunchDaemons/org.apache.httpd.plist: Could not find specified service
  • 如果 apache 作为服务安装,应该这样做。您可能需要检查拼写错误。您也可以尝试在网络共享设置中关闭网络服务。
  • 这很奇怪。我不记得曾经安装过 apache,所以我不知道它为什么会运行。你指的是我的浏览器还是 apache 中的网络服务?
【解决方案2】:

你可以试试:

ps -e | grep httpd

这将向您显示 apache httpd PID。 另一种方法是使用brew 安装pstree

brew install pstree

pstree 将正在运行的进程显示为树。然后您可以使用以下命令找到 PPID

pstree | grep httpd

然后你可以使用kill 来终止进程。我在 macOS High Sierra 上测试了两种方式。

【讨论】:

  • 这可能是我最接近修复它的方法。我可以看到双向运行的详细流程。我仍然遇到的问题是,当我从ps -e | grep httpd 杀死进程时,它们就会回来。我输入了所有的 PID 并立即将它们全部杀死。这是正确的方法吗?此外,当我使用 pstree 做同样的事情时,他们不会回来,但服务仍在端口 8080 上运行。在我从 pstree 和 ps 中删除所有内容后,他们确实回到了 pstree。你觉得我在做什么有什么问题吗?
  • @Bert 尝试使用sudo,如果不起作用,请尝试使用kill -9 或将它们组合起来。您还看到是什么进程导致启用 apache,例如mamp、xampp 应用程序?
  • 我都用过 sudo 。 sudo 和 kill 结合起来会杀死进程,但它们会回来。至于是什么启用了 apache,我不知道。如果有帮助,这就是 pstree 显示的内容:
  • 68580 root /Library/PostgreSQL/EnterpriseDB-ApachePHP/apache/bin/httpd -D FOREGROUND -f /Library/PostgreSQL/EnterpriseDB-ApachePHP/apache/conf/httpd.conf |--- 68581 daemon /Library/PostgreSQL/EnterpriseDB-ApachePHP/apache/bin/httpd -D FOREGROUND -f /Library/PostgreSQL/EnterpriseDB-ApachePHP/apache/conf/httpd.conf |--- 68582 daemon /Library/PostgreSQL/EnterpriseDB-ApachePHP/apache/bin/httpd -D FOREGROUND -f /Library/PostgreSQL/EnterpriseDB-ApachePHP/apache/conf/httpd.conf
  • 出于某种原因,您必须以某种方式启用 postgresql。同样从输出来看,它似乎以 root 权限运行(因此您可能需要使用 sudo)。试试sudo launchctl stop com.edb.launchd.postgresql-your_version。要查找版本使用选项卡。
【解决方案3】:
lsof -nP -i | grep "TCP.*:8080.*LISTEN"

使用lsof 查找正在端口 8080 上等待连接(“LISTEN”)的进程。使用该输出中的 PID 列终止该进程。

【讨论】:

  • 当我运行该命令时,我得到:httpd 94 root 4u IPv6 0x53ad559dfbdef59d 0t0 TCP *:8080 (LISTEN) httpd 219 daemon 4u IPv6 0x53ad559dfbdef59d 0t0 TCP *:8080 (LISTEN) httpd 220 daemon 4u IPv6 0x53ad559dfbdef59d 0t0 TCP *:8080 (LISTEN) httpd 221 daemon 4u IPv6 0x53ad559dfbdef59d 0t0 TCP *:8080 (LISTEN) httpd 654 daemon 4u IPv6 0x53ad559dfbdef59d 0t0 TCP *:8080 (LISTEN) -- 杀死所有这些后,apache 服务仍在运行。
  • 听起来“杀死”方法是有问题的。之后是相同的 PID(= 杀死信号被忽略或未传递)还是不同(= 某些东西正在重新启动进程)。
  • 杀死是通过添加 sudo 命令进行的。 PID 正在发生变化,因此它们正在以某种方式重新启动。
  • sudo 不保证收到信号。在sudo kill -9 之后仍然会出现晦涩的案例,这就是我问的原因。但这不是你的问题。您的问题是正在重新启动它。这更难诊断,但我会先查看 /var/log/ 中的哪些日志文件在您终止进程时发生了变化。我还考虑尝试赢得竞争条件以打开端口以查看产生的日志消息。 nc -l 8080 可以在端口 8080 上启动服务器并阻止其他东西在那里监听。
  • @Bert - Apache 有一个以 root 身份运行的进程和一些以较低权限用户身份运行的其他进程(取决于负载和配置)。如果你想停止 apache,你最好使用操作系统控制服务的正常方法,而不是试图在背后捅他们一刀,希望他们不会再次崛起。如果根进程还在运行,子进程就会回来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2018-02-16
  • 2022-12-30
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
相关资源
最近更新 更多