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.
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:
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 có 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 awk
ra 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 mà 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 localhost
và 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 đề.
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
$ 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...
...
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