我正在为我的服务器开发一个小型控制面板。我需要一个命令来说明是否httpd
正在运行或已停止。
可能也会对其他服务使用相同的代码。
答案1
您可以在大多数 Linux 发行版上普遍使用 services 命令。
$ service <service> status
例子
$ service httpd status
httpd (pid 23569) is running...
同一命令可用于单独运行的所有服务或查找所有服务的状态。
$ 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...
...
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
系统
$ 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
暴发户
$ 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
参考
答案2
大多数人通过 init 系统运行 httpd(Apache、Nginx 等)。如果您是从软件包安装的,那么几乎肯定会出现这种情况。几乎所有这些初始化系统都有一个方法在运行时可以正常工作。就我而言,我使用 nginx,它提供 SysV 风格的初始化脚本并接受status
参数,如下所示:
$ /etc/init.d/nginx status
* nginx is running
显然,如果您正在运行不同的 httpd、脚本或 init 系统,那么您将有一个稍微不同的语法,但除非您自己手动启动 httpd(这感觉是世界上最糟糕的想法),否则您可能正在使用一个不错的、托管的启动脚本,它将允许您查询状态。
slm 的回答有更多关于这种初始化查询的信息,但信任的问题是它只能真正告诉您进程是否仍在运行。你的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
我们还可以检查哪个进程也在运行以确保正确的httpd 正在运行。我们可以做各种检查。取决于你想有多偏执:)
但即便如此,这也只是 httpd 的反映。想真正测试一下吗?好吧,让我们测试它。
$ wget --spider -S "http://localhost" 2>&1 | awk '/HTTP\// {print $2}'
200
我只是查看响应代码(200 表示“A-Okay!”),但我们可以深入研究并实际测试输出,以确保它正确生成。
但即使这样也不是那么彻底。你检查一下localhost
,结果显示为 200,没有问题吗?如果海狸咬断了为 httpd 供电的网络电缆(但不是系统的其余部分)怎么办?然后呢?!当您实际停机时,您正在报告正常运行时间。没有什么比不正确的状态数据看起来更不专业的了。
因此,让我们与外部服务器(最好是在完全不同的连接上,在很远很远的另一个星系中)进行对话,并要求它查询我们的服务器:
$ ssh tank 'wget --spider -S "http://bert" 2>&1' | awk '/HTTP\// {print $2}'
200
到目前为止,报告的任何问题要么是应用程序内问题(可以有自己的错误处理和报告,要么位于客户端)。
这些测试的组合也可以帮助确定问题所在。