Làm thế nào để tìm hiểu xem httpd có chạy hay không thông qua dòng lệnh?


29

Tôi đang làm việc trên một bảng điều khiển nhỏ cho máy chủ của mình. Tôi cần một lệnh sẽ nói nếu httpdđang chạy hoặc dừng.

Có lẽ cũng sẽ sử dụng cùng một mã cho các dịch vụ khác.

Câu trả lời:


28

Hầu hết mọi người chạy httpd của họ (Apache, Nginx, v.v.) thông qua một hệ thống init. Đó gần như là trường hợp nếu bạn đã cài đặt từ một gói. Hầu như tất cả các hệ thống init này đều có phương pháp hoạt động nếu nó chạy. Trong trường hợp của tôi, tôi đang sử dụng nginx, nó vận chuyển tập lệnh init kiểu SysV và chấp nhận một statusđối số, như vậy:

$ /etc/init.d/nginx status
 * nginx is running

Rõ ràng nếu bạn đang chạy một hệ thống httpd, script hoặc init khác nhau, bạn sẽ có một cú pháp hơi khác nhưng trừ khi bạn tự khởi chạy httpd (cảm giác đó là ý tưởng tồi tệ nhất trên thế giới), bạn có thể sử dụng một kịch bản khởi động được quản lý tốt đẹp sẽ cho phép bạn truy vấn trạng thái.

Câu trả lời của slm có nhiều hơn về loại truy vấn init này nhưng vấn đề với việc tin tưởng là nó chỉ thực sự cho bạn biết nếu một tiến trình vẫn đang chạy. Quá trình chính của httpd của bạn thể đang chạy nhưng theo một cách nào đó đang bế tắc. Nó rất có ý nghĩa để bỏ qua các thử nghiệm init đơn giản và chuyển sang các thử nghiệm hành vi.

Một điều chúng tôi biết về httpds là họ lắng nghe. Thông thường trên cổng *:80, nhưng nếu không có, bạn có thể điều chỉnh mã theo mã. Ở đây tôi chỉ đưa awkra kết quả netstatđể xem liệu nó có nghe đúng cổng không.

$ 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

Chúng tôi cũng có thể kiểm tra quá trình đang chạy quá để đảm bảo đúng httpd đang chạy. Chúng tôi có thể làm tất cả các loại kiểm tra. Phụ thuộc vào mức độ hoang tưởng mà bạn muốn trở thành :)

Nhưng ngay cả đó chỉ là sự phản ánh của một httpd. Bạn muốn thực sự kiểm tra nó? Vâng, hãy kiểm tra nó.

$ wget --spider -S "http://localhost" 2>&1 | awk '/HTTP\// {print $2}'
200

Tôi chỉ nhìn vào mã phản hồi (200 có nghĩa là "A-Okay!") Nhưng một lần nữa, chúng tôi có thể đào sâu và thực sự kiểm tra đầu ra để đảm bảo rằng nó được tạo chính xác.

Nhưng ngay cả điều này không phải là kỹ lưỡng. Bạn đang kiểm tra localhostvà nó báo cáo 200, không có gì sai? Điều gì sẽ xảy ra nếu đèn hiệu nhai qua cáp mạng cung cấp httpd (nhưng không phải phần còn lại của hệ thống)? Rồi sao?! Bạn đang báo cáo thời gian hoạt động khi bạn thực sự xuống. Vài điều trông không chuyên nghiệp hơn dữ liệu trạng thái không chính xác.

Vì vậy, hãy nói chuyện với một máy chủ bên ngoài (lý tưởng là trên một kết nối hoàn toàn khác, ở một thiên hà khác ở rất xa) và yêu cầu nó truy vấn máy chủ của chúng tôi:

$ ssh tank 'wget --spider -S "http://bert" 2>&1' | awk '/HTTP\// {print $2}'
200

Đến thời điểm này, bất kỳ vấn đề nào được báo cáo đều là sự cố trong ứng dụng (có thể có lỗi riêng - tự xử lý và báo cáo, hoặc chúng ở cuối máy khách).

Một sự kết hợp của các xét nghiệm này có thể giúp giảm bớt vấn đề.


3
chuyện gì đã xảy ra với httpd?
Lạch

@Calet Ý bạn là gì?
Oli

4
+1 cho câu trả lời hay nhưng OP đã hỏi về httpd và bạn đã sử dụng nginx
Lạch

4
@Calet Trong sách của tôi, "httpd" có nghĩa là "http daemon; máy chủ web". Không phải là một cụ thể. Bạn nghĩ tôi nên làm gì khác nhau? Tôi không biết làm thế nào tôi có thể kiểm tra kỹ hơn nữa mà không cần phải mua nó trước.
Oli

3
Nếu tôi có thể mua cho bạn một thức uống để nói rằng tôi sẽ, cổ điển. Tôi nghĩ OP có nghĩa là httpd
Lạch

25

Bạn có thể sử dụng lệnh dịch vụ phổ biến trên hầu hết các bản phân phối Linux.

$ service <service> status

Thí dụ

$ service httpd status
httpd (pid  23569) is running...

Lệnh tương tự này có thể được sử dụng cho tất cả các dịch vụ đang chạy trên cơ sở cá nhân hoặc để tìm tất cả trạng thái của dịch vụ.

$ 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...
...

Các phương thức khác nhau trong SysVinit, Systemd và Upstart cho các dịch vụ liệt kê

Nếu bạn đang sử dụng một trong các khung quản lý dịch vụ điển hình hơn, bạn có thể sử dụng các phương pháp sau để liệt kê các dịch vụ trong mỗi khung.

SysVinit

$  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

Hệ thống

$ 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  

Mới bắt đầu

$ 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

Tài liệu tham khảo


Đây là câu trả lời đúng theo như tôi biết. Nhưng OP đã chấp nhận người khác :)
Ramesh

@Ramesh - Không sao đâu, Oli's A cũng đúng, nó chỉ là một chút bí truyền.
slm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.