如何通过命令行查明httpd是否正在运行?

use*_*804 32 linux process webserver

我正在为我的服务器开发一个小型控制面板。我需要一个命令来说明httpd是运行还是停止。

其他服务也可能使用相同的代码。

Oli*_*Oli 28

大多数人通过初始化系统运行他们的 httpd(Apache、Nginx 等)。如果您是从软件包安装的,则几乎可以肯定会出现这种情况。几乎所有这些 init 系统都有一个方法来解决它是否正在运行。就我而言,我使用的是 nginx,它提供了一个 SysV 风格的 init 脚本并接受一个status参数,如下所示:

$ /etc/init.d/nginx status
 * nginx is running
Run Code Online (Sandbox Code Playgroud)

显然,如果您运行不同的 httpd、脚本或 init 系统,您的语法将略有不同,但除非您自己手动启动 httpd(这感觉是世界上最糟糕的主意),否则可能使用一个不错的托管启动脚本,它允许您查询状态。

slm 的回答有更多关于这种 init 查询的信息,但信任的问题在于它只能告诉你一个进程是否仍在运行。您的 httpd 的主进程可能正在运行,但以某种方式陷入僵局。跳过简单的初始化测试并继续进行行为测试是很有意义的。

我们知道的关于 httpds 的一件事是它们会倾听。通常在 port 上*:80,但如果你没有,你可以修改下面的代码。在这里,我只是查看awk的输出netstat以查看它是否在正确的端口上侦听。

$ sudo netstat -ntlp | awk '$4=="0.0.0.0:80"'
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2079/nginx
Run Code Online (Sandbox Code Playgroud)

我们还可以检查哪个进程也在运行,以确保正确的httpd 正在运行。我们可以做各种检查。取决于你想变得多么偏执:)

但即便如此,这也只是 httpd 的反映。想真正测试一下吗?好吧,让我们测试一下。

$ wget --spider -S "http://localhost" 2>&1 | awk '/HTTP\// {print $2}'
200
Run Code Online (Sandbox Code Playgroud)

我只是在查看响应代码(200 表示“A-Okay!”)但同样,我们可以深入研究并实际测试输出以确保它正确生成。

但即使这样也不是那么彻底。你正在检查localhost,它报告了 200,没有错吗?如果海狸咬断了提供 httpd(而不是系统的其余部分)的网线怎么办?然后呢?!当您实际停机时,您正在报告正常运行时间。没有什么比不正确的状态数据看起来更不专业的了。

因此,让我们与外部服务器交谈(理想情况下,在完全不同的连接上,在另一个遥远的星系中)并要求它查询我们的服务器:

$ ssh tank 'wget --spider -S "http://bert" 2>&1' | awk '/HTTP\// {print $2}'
200
Run Code Online (Sandbox Code Playgroud)

到目前为止,报告的任何问题要么是应用程序内问题(它们可以有自己的错误处理和报告,或者它们在客户端)。

这些测试的组合也可以帮助确定问题所在。

  • +1 是一个很好的答案,但 OP 询问了 httpd 并且您使用了 nginx (4认同)
  • @Creek 在我的书中,“httpd”的意思是“http 守护进程;一个网络服务器”。不是一个特定的。你认为我应该怎么做?我不知道如何才能更彻底地检查一个而不需要先买一杯饮料。 (4认同)
  • httpd 怎么了? (3认同)
  • 如果我可以请你喝一杯,因为我说我愿意,经典。我认为 OP 的意思是 apache 的 [httpd](https://httpd.apache.org/docs/2.4/programs/httpd.html) (3认同)

slm*_*slm 28

您可以在大多数 Linux 发行版上普遍使用 services 命令。

$ service <service> status
Run Code Online (Sandbox Code Playgroud)

例子

$ service httpd status
httpd (pid  23569) is running...
Run Code Online (Sandbox Code Playgroud)

这个相同的命令可用于单独运行的所有服务或查找所有服务的状态。

$ service --status-all
python is stopped
automount (pid 22457) is running...
Avahi daemon is not running
Avahi DNS daemon is not running
crond (pid  23577) is running...
gpm is stopped
hald is stopped
httpd (pid  23569) is running...
...
Run Code Online (Sandbox Code Playgroud)

SysVinit、Systemd 和 Upstart 中列出服务的各种方法

如果您使用的是更典型的服务管理框架之一,则可以使用以下方法列出每个框架中的服务。

系统初始化

$  ls -l /etc/init.d/ | head -10
total 220
-rwxr-xr-x 1 root root  1422 Jan 13  2009 ajaxterm
-rwxr-xr-x 1 root root  3052 Apr 20  2012 autofs
-rwxr-xr-x 1 root root  1877 Apr 13  2011 avahi-daemon
-rwxr-xr-x 1 root root  1824 Apr 13  2011 avahi-dnsconfd
-rwxr-xr-x 1 root root  1926 Feb 22  2012 crond
-rwxr-xr-x 1 root root 14291 Dec 19  2011 functions
-rwxr-xr-x 1 root root  1778 Jan  6  2007 gpm
-rwxr-xr-x 1 root root  1586 Mar  5  2011 haldaemon
-rwxr-xr-x 1 root root  5742 Dec 19  2011 halt
Run Code Online (Sandbox Code Playgroud)

系统化

$ systemctl list-unit-files --type=service | head -10
UNIT FILE                                   STATE   
abrt-ccpp.service                           enabled 
abrt-oops.service                           enabled 
abrt-pstoreoops.service                     disabled
abrt-vmcore.service                         enabled 
abrt-xorg.service                           enabled 
abrtd.service                               enabled 
accounts-daemon.service                     enabled 
alsa-restore.service                        static  
alsa-state.service                          static  
Run Code Online (Sandbox Code Playgroud)

暴发户

$ initctl list | head -10
avahi-daemon start/running, process 1090
mountall-net stop/waiting
nmbd start/running, process 2045
passwd stop/waiting
rc stop/waiting
rsyslog start/running, process 1088
tty4 start/running, process 1211
udev start/running, process 483
upstart-udev-bridge start/running, process 480
ureadahead-other stop/waiting
Run Code Online (Sandbox Code Playgroud)

参考