Dừng đơn vị systemd cùng với khác. Bắt đầu làm việc


1

Trên máy chủ CentOS7, tôi có một ngăn xếp ứng dụng được tạo bởi máy chủ web Tomcat và máy chủ MySQL DB, cả hai đều được cài đặt trên cùng một VM. Tôi muốn họ bắt đầu và dừng lại với nhau theo thứ tự này:

BẮT ĐẦU: MySQL -> Tomcat
DỪNG: Tomcat -> MySQL

Đọc tài liệu của đơn vị systemd, tôi đã quản lý để bắt đầu chúng cùng với Requires=chỉ thị, nhưng khi tôi dừng tomcat với systemctl thì dừng tomcat.service, MySQL tiếp tục chạy. Trên nhật ký hệ thống tôi nhận thấy rằng nó thậm chí không cố gắng ngăn chặn MySQL, vì vậy phải có điều gì đó không ổn với đơn vị systemd.

Đây là đơn vị của tôi:

# Tệp đơn vị Systemd cho tomcat
[Đơn vị]
Mô tả = Container ứng dụng web Apache Tomcat
After = syslog.target network.target mysql.service
Yêu cầu = mysql.service

[Dịch vụ]
Loại = rèn

Môi trường = JAVA_HOME = / opt / jdk
Môi trường = CATALINA_PID = / opt / tomcat / temp / tomcat.pid
Môi trường = CATALINA_HOME = / opt / tomcat
Môi trường = CATALINA_BASE = / opt / tomcat

ExecStart = / opt / tomcat / bin / startup.sh
ExecStop = / bin / kill -15 $ MAINPID

Người dùng = tomcat
Nhóm = tomcat

[Tải về]
WantedBy = multi-user.target

Linh cảm là bạn nên thêm Before vào mysql.service
hhoke1

Câu trả lời:


6

Những gì bạn đang thấy ở đây là hành vi systemd dự kiến. Sự Requires=phụ thuộc sẽ đảm bảo mysql.serviceđược bắt đầu bất cứ khi nào tomcat.servicebắt đầu, nhưng một khi đã bắt đầu, hai đơn vị sẽ độc lập và một đơn vị sẽ không bị dừng khi đơn vị kia hoạt động.

Nếu bạn thực sự muốn mysql.servicedừng lại khi nào tomcat.service, bạn có thể sử dụng PartOf=chỉ thị liên kết các đơn vị dừng và khởi động lại.

Đối với ví dụ bạn đã mô tả ( mysql.servicedừng lại bất cứ khi nào tomcat.servicedừng lại), điều bạn cần là thêm PartOf=tomcat.servicevào định nghĩa mysql.service. Thông thường, cách tốt nhất để làm như vậy là sử dụng tệp ghi đè, bạn có thể làm với systemctl edit mysql.servicetrình soạn thảo văn bản với tệp trống, sau đó bạn có thể thêm đoạn mã này vào tệp:

[Unit]
PartOf=tomcat.service

Điều này sẽ được lưu trong một tệp /etc/systemd/system/mysql.service.d/override.conftrở thành một phần của mysql.service, bạn có thể kiểm tra xem với systemctl cat mysql.service.

Sau những thay đổi đó và a systemctl daemon-reload, điều này sẽ hoạt động như bạn mong đợi ...

Về việc đặt hàng, mọi thứ sẽ hoạt động như bạn mong đợi với đơn After=mysql.servicebạn có tomcat.service, vì các phụ thuộc được tuân thủ theo thứ tự ngược lại khi dừng dịch vụ. (Có nghĩa là, trong trường hợp này, tomcat.servicesẽ bị dừng trước, tiếp theo là mysql.service.)


Dừng các đơn vị theo cách này có thể không phải lúc nào cũng là một ý tưởng hay ... Có lẽ cách tiếp cận tốt hơn một chút là tạo một .targetđơn vị riêng để nhóm tất cả các dịch vụ bạn muốn kiểm soát cùng nhau. Có lẽ một cái gì đó như webservices.target.

Bạn sẽ tạo đơn vị đó với nội dung như:

[Unit]
Description=Web Services
Requires=tomcat.service mysql.service
After=tomcat.target mysql.service

[Install]
WantedBy=multi-user.target

Và sau đó có cả hai tomcat.servicemysql.serviceđặt a PartOf=webservices.target, sử dụng cơ chế ghi đè được mô tả ở trên.

Cho phép đơn vị mục tiêu với systemctl enable webservices.target, và sau đó bạn có thể bắt đầu và dừng cả hai dịch vụ cùng với systemctl start webservices.targethoặc systemctl stop webservices.target.


Điều này chủ yếu là từ bộ nhớ ... Nếu điều này vẫn không hiệu quả với bạn hoặc nếu điều gì đó không rõ ràng, xin vui lòng cho tôi biết, tôi có thể theo dõi ở đây để giúp bạn tìm ra điều này.
filbranden

3
Làm việc rất tốt tạo ra một webservices.targetnhư bạn đề nghị. Phát hiện ra sự tồn tại của systemctl edit ...Cảm ơn bạn!
JB
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.