giao thức sẵn sàng không phù hợp
Như Wieland ngụ ý, Type
dịch vụ này rất quan trọng. Cài đặt đó biểu thị những gì hệ thống giao thức sẵn sàng mong đợi dịch vụ nói. Một simple
dịch vụ được coi là đã sẵn sàng ngay lập tức. Một forking
dịch vụ được thực hiện để sẵn sàng sau khi quy trình ban đầu của nó rèn một đứa trẻ và sau đó thoát ra. Một dbus
dịch vụ được thực hiện để sẵn sàng khi một máy chủ xuất hiện trên Desktop Bus. Và kể từ đó trở đi.
Nếu bạn không nhận được giao thức sẵn sàng được khai báo trong đơn vị dịch vụ để khớp với những gì dịch vụ thực hiện, thì mọi thứ sẽ trở nên tồi tệ. Sự không phù hợp của giao thức sẵn sàng khiến các dịch vụ không khởi động chính xác hoặc (thường là) bị chẩn đoán bởi hệ thống là không thành công. Khi một dịch vụ được coi là không khởi động systemd, đảm bảo rằng mọi quy trình bổ sung mồ côi của dịch vụ có thể bị ngừng hoạt động là một phần của sự cố (theo quan điểm của nó) sẽ bị hủy để đưa dịch vụ trở lại không hoạt động tiểu bang.
Bạn đang làm chính xác điều này.
Trước hết, những thứ đơn giản: sh -c
không khớp Type=simple
hoặc Type=forking
.
Trong simple
giao thức, quy trình ban đầu được coi là quy trình dịch vụ. Nhưng trên thực tế, một sh -c
trình bao bọc chạy chương trình dịch vụ thực tế như một tiến trình con . Vì vậy, MAINPID
đi sai và ExecReload
ngừng làm việc, cho người mới bắt đầu. Khi sử dụng Type=simple
, người ta phải sử dụng sh -c 'exec …'
hoặc không sử dụng sh -c
ở nơi đầu tiên. Điều thứ hai thường là khóa học chính xác hơn một số người nghĩ.
sh -c
cũng không khớp Type=forking
. Giao thức sẵn sàng cho một forking
dịch vụ khá cụ thể. Quá trình ban đầu phải rẽ nhánh một đứa trẻ, và sau đó thoát ra. systemd áp dụng thời gian chờ cho giao thức này. Nếu quy trình ban đầu không rẽ nhánh trong thời gian quy định, đó là thất bại để sẵn sàng. Nếu quy trình ban đầu không thoát trong thời gian quy định, thì đó cũng là một thất bại.
nỗi kinh hoàng không cần thiết đó là ossec-control
Điều này đưa chúng ta đến những thứ phức tạp: ossec-control
kịch bản đó .
Nó chỉ ra rằng đó là một rc
kịch bản Hệ thống 5 , từ bỏ 4 đến 10 quy trình, chính chúng trong ngã ba rẽ và thoát ra. Đây là một trong những rc
tập lệnh Hệ thống 5 cố gắng quản lý toàn bộ tập hợp các quy trình máy chủ trong một tập lệnh duy nhất, với for
các vòng lặp, điều kiện cuộc đua, tùy ý sleep
để cố gắng tránh chúng, các chế độ thất bại có thể làm nghẹt hệ thống ở trạng thái nửa khởi động, và tất cả những điều khủng khiếp khác khiến mọi người phát minh ra những thứ như Bộ điều khiển tài nguyên hệ thống AIX và daemontools hai thập kỷ trước. Và đừng quên tập lệnh shell ẩn trong một thư mục nhị phân mà nó viết lại một cách nhanh chóng, để thực hiện các động từ enable
và disable
động từ riêng.
Vì vậy, khi bạn /bin/sh -c '/var/ossec/bin/ossec-control start'
những gì xảy ra là:
- systemd rèn những gì nó mong đợi là quá trình dịch vụ.
- Đó là cái vỏ, cái dĩa
ossec-control
.
- Điều đó lần lượt dĩa từ 4 đến 10 đứa cháu.
- Các cháu tất cả ngã ba và lần lượt thoát ra.
- Các cháu chắt tất cả ngã ba và thoát ra song song.
ossec-control
lối thoát hiểm
- Vỏ đầu tiên thoát ra.
- Các quy trình dịch vụ là những người vĩ đại-great- cháu, nhưng vì cách này các trận đấu làm việc không những
forking
hay các simple
giao thức sẵn sàng, systemd xem xét dịch vụ nói chung đã thất bại và đóng nó lại xuống.
Không có gì kinh dị này là thực sự cần thiết theo systemd cả. Không có nó.
một đơn vị dịch vụ mẫu systemd
Thay vào đó, người ta viết một đơn vị mẫu rất đơn giản :
[Đơn vị]
Mô tả = Máy chủ OSSEC HIDS% i
Sau = mạng.target
[Dịch vụ]
Loại = đơn giản
ExecStartPre = / usr / bin / env / var / ossec / bin /% p-% i -t
ExecStart = / usr / bin / env / var / ossec / bin /% p-% i -f
[Tải về]
WantedBy = multi-user.target
Lưu cái này như /etc/systemd/system/ossec@.service
.
Các dịch vụ thực tế khác nhau là khởi tạo của mẫu này, được đặt tên:
ossec@dbd.service
ossec@agentlessd.service
ossec@csyslogd.service
ossec@execd.service
ossec@agentd.service
ossec@logcollector.service
ossec@syscheckd.service
ossec@maild.service
ossec@analysisd.service
ossec@remoted.service
ossec@monitord.service
Sau đó, chức năng bật và tắt xuất phát trực tiếp từ hệ thống quản lý dịch vụ (đã sửa lỗi RedHat 752774 ), không cần các tập lệnh shell ẩn.
systemctl kích hoạt ossec @ dbd ossec @ agentlessd ossec @ csyslogd ossec @ maild ossec @ execd ossec @ analyd ossec @ logcollector ossec @ remote ossec @ syscheckd ossec @ monitord
Hơn nữa, systemd được biết về và theo dõi từng dịch vụ thực tế trực tiếp. Nó có thể lọc nhật ký của họ với journalctl -u
. Nó có thể biết khi một dịch vụ cá nhân đã thất bại. Nó biết những dịch vụ nào được cho là được kích hoạt và chạy.
Nhân tiện: Type=simple
và -f
tùy chọn là ngay tại đây như trong nhiều trường hợp khác. Rất ít dịch vụ trong tự nhiên thực sự báo hiệu sự sẵn sàng của họ bằng cách exit
, và đây không phải là những trường hợp như vậy. Nhưng đó là những gì forking
loại có nghĩa. Các dịch vụ trong tự nhiên chỉ là ngã ba và thoát vì một số quan niệm sai lầm nhận được rằng đó là những gì các công ty phải làm. Trên thực tế, không phải vậy. Nó đã không được kể từ những năm 1990. Đã đến lúc bắt kịp.
đọc thêm