我的问题有三个:
1)我如何弄清楚这里到底发生了什么,
2)我如何防止它再次发生,
3)如果再次发生,我可以配置 Monit 来检测并重新启动服务器吗?
事情是这样的:
我托管在 Ubuntu 9.10 RackSpace 云服务器上的 apache2 服务器今天早上宕机了 - 并且重启失败[是的,我应该启动 - 但是如果没有服务器需要停止,重启就会退回到启动,所以这应该没关系] 如下:
user@host: sudo /etc/init.d/apache2 restart
* Restarting web server apache2
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
谷歌来帮忙了:我按照这篇文章中的说明操作http://www.linuxquestions.org/questions/linux-newbie-8/could-not-bind-to-address-0-0-0-0-80-a-405377/#post3516504
for i in `ps auwx | grep -i nobody | awk {'print $2'}`; do kill -9 $i; done
并且启动时没有错误。所以,现在我已修复,但需要了解更多信息。
编辑:刚刚看到这个:Apache2 崩溃——希望这不是同一件事。
编辑:到目前为止一切顺利--rootkit检查没有问题--
答案1
我在使用各种初始化脚本时遇到过三种情况。
user@host 有关闭 apache2 的权限,但 apache 在端口 80 上运行,需要 root 才能启动。使用 sudo 重新启动 apache2。但是 user@root 应该能够重新加载 apache2。
如果 user@host 可以启动 apache2,那么您可能遇到了时间问题,即 apache 尝试在所有子进程退出之前启动。可以使用 Reload 应用许多配置更改,并且不需要在启动新服务器之前退出旧子进程。请参阅 的文档apachectl graceful
。
当服务器已运行时,PID 文件通过运行 start 更改为不同的 PID。Stop 尝试从 PID 文件中停止进程,但由于无法获取旧进程使用的资源,因此进程不再运行。
答案2
关于问题
您收到的错误意味着 apache 无法启动使用端口 80,因为该端口正被另一个应用程序使用。
现在讨论您的解决方案:
for i in `ps auwx | grep -i nobody | awk {'print $2'}`; do kill -9 $i; done
该命令查看所有正在运行的进程 ( ps auxw
) 并查找包含“nobody”的列表项 ( grep -i nobody
)。该-i
参数确保过滤器不区分大小写。
awk {'print $2'}
将输出限制到第二列。
最后do kill -9 $i
用信号 9(KILL)杀死剩余的进程
答案3
如果你需要知道端口上运行着什么
fuser 80/tcp
这将输出端口上运行的应用程序的 pid