Làm cách nào để tự động khởi động dịch vụ khi khởi động trong RHEL / CentOS 7?

Tự hỏi làm thế nào để quản lý các dịch vụ trong nền hoặc khi khởi động?


Cơ chế quản lý và bắt đầu các quá trình khởi động đã được thay đổi. Cho đến khi RHEL / CentOS 6.x, bạn sẽ tạo một tập lệnh trong /etc/init.d/ và được bật với sự trợ giúp của chkconfig nhưng mọi thứ lại khác VÒI 7.

Nó được thay thế bởi systemd và vì nó ít nhiều là trình quản lý quy trình mặc định trên các phiên bản Linux chính, Quản trị viên hệ thống thành thạo các hương vị khác sẽ cảm thấy như ở nhà. Trong bài viết này, chúng ta sẽ tìm hiểu systemd là gì, lý do của việc chuyển đổi là gì và cách sử dụng systemd để thiết lập, chạy và quản lý các quy trình nền với nó.

Hệ thống là gì?

Vì mọi quy trình trong Linux đều hiển thị rõ ràng, hãy cho phép xem hệ thống đang ẩn nấp. Trên hệ thống của tôi, tôi nhận được như sau:

~ $ ps -ef | hệ thống grep
root 1 0 0 tháng 11? 00:01:02 / lib / systemd / systemd –system –deserialize 22
tin nhắn + 768 1 0 tháng 11? 00:05:46 / usr / bin / dbus-daemon –system –address = systemd: –nofork –nopidfile –systemd-activ –syslog-only
root 805 1 0 tháng 11? 00:10:22 / lib / systemd / systemd-logind
ankush 1132 1 0 tháng 11? 00:00:00 / lib / systemd / systemd – người dùng
ankush 1176 1132 0 tháng 11? 00:04:50 / usr / bin / dbus-daemon –session –address = systemd: –nofork –nopidfile –systemd-activ –syslog-only
ankush 9772 20029 0 21:11 điểm / 6 00:00:00 grep –color = auto systemd
systemd + 17298 1 0 tháng 11 năm 19? 00:00:12 / lib / systemd / systemd-giải quyết
systemd + 17303 1 0 tháng 11? 00:00:00 / lib / systemd / systemd-timesyncd
root 17307 1 0 tháng 11? 00:00:02 / lib / systemd / systemd-journald
root 18182 1 0 tháng 11? 00:00:00 / lib / systemd / systemd-udevd

Tôi cá là bạn nhận thấy nó ngay lập tức. quá trình đầu tiên trong danh sách được khởi chạy với tư cách là người dùng root và có pid 1.

Chắc chắn, đây là quá trình đầu tiên mà hệ thống khởi chạy khi khởi động. Nói xin chào với systemd. ��

Vì vậy, khá đơn giản, systemd là quy trình mẹ mẹ của ra mắt, khởi chạy, quản lý và chấm dứt các quy trình khác trong hệ thống, bên cạnh việc cung cấp thông tin về việc ghi nhật ký, trạng thái hệ thống tệp, v.v..

Một lưu ý về tên, mặc dù. Tên này thực sự là systemd chứ không phải System D hay bất cứ thứ gì khác. Phần mềm dv là viết tắt của daemon, một quy trình Linux tiêu chuẩn hoạt động (ẩn?) Trong nền và được đính kèm với bất kỳ phiên cuối nào.

Tại sao RHEL chuyển sang systemd?

Như chúng ta đã thảo luận, systemd là một trình quản lý hệ thống và quy trình, và trong RHEL 7, thay thế chương trình nổi tiếng Upstart. Tại sao RHEL (Oracle?) Có quyết định này? Chà, có những lý do rất chính đáng cho việc này, vì vậy, hãy nhanh chóng xem xét.

Khởi tạo dịch vụ song song

Mở khóa chương trình SysV init, systemd có khả năng khởi chạy các dịch vụ song song. Chương trình init, ngược lại, khởi chạy từng cái một. Trong thời đại mà ngay cả các thiết bị di động cũng có CPU đa lõi, việc thiếu khởi tạo song song là một bước ngoặt lớn.

Quản lý dịch vụ năng động (nóng)

Nếu bạn đã nhận thấy rằng các ổ USB cần được gắn rõ ràng trên các hệ thống Fedora trước đó trong khi chúng sẽ tự động mở trên Ubuntu và các bản phân phối tương tự, thì lý do là systemd. Nó có thể phát hiện các thay đổi trực tiếp trong phần cứng và chấm dứt / khởi chạy các dịch vụ khi cần thiết. Một số người có thể lập luận rằng nó không cần thiết, nhưng với nhiều người, bất cứ điều gì làm giảm gánh nặng nhận thức đều được hoan nghênh nhất.

Ra mắt dịch vụ hoãn lại

systemd làm cho thời gian khởi động ngắn hơn vì nó có thể trì hoãn việc khởi chạy dịch vụ đến khi nó thực sự cần thiết. Một ví dụ đơn giản là các dịch vụ liên quan đến hệ thống tệp mạng. Nếu không có đĩa mạng nào có sẵn, thì không có nghĩa là có một dịch vụ đang hoạt động.

Quá trình giao tiếp nhanh hơn

Các khả năng song song của systemd mang đến giao tiếp giữa các quá trình. systemd có thể cung cấp quyền truy cập song song vào ổ cắm và bus hệ thống, giảm đáng kể thời gian chờ xử lý cho tài nguyên truyền thông.

Tự động khởi động lại

Nếu một dịch vụ gặp sự cố, systemd có thể phát hiện điều đó và cố gắng khởi động lại nó. Hầu hết thời gian, khởi động lại đơn giản là tất cả những gì cần thiết để ứng dụng bắt đầu hoạt động trở lại, trừ khi có nhiều vấn đề cơ bản hơn.

Dù sao, systemd làm cho cuộc sống của một sysadmin dễ dàng hơn ở đây.

systemd trong RHEL7 – Điều gì thay đổi đối với Sysadmin?

Nếu bạn có một cảm giác dai dẳng rằng systemd isn sẽ là tất cả chuông và còi, thì bạn đã đúng. Có một vài sự không tương thích đáng kể có thể gây bất ngờ cho RHEL sysadmin. Hãy xem nhanh.

Hỗ trợ runlevel hạn chế

systemd có một sự công nhận khá tồi tệ và hỗ trợ cho các đường băng. Không phải tất cả các đường băng đều được hỗ trợ và đối với một số mục tiêu thậm chí có thể không có. Trong các trường hợp như vậy, systemd trả về ăn N Nồng như một phản hồi cho các lệnh runlevel, biểu thị rằng nó không có runlevel tương ứng cho mục tiêu này. Nói chung, Red Hat khuyên chúng ta không nên sử dụng (!) Các lệnh runlevel.

Không có lệnh tùy chỉnh

Cái này sẽ bị tổn thương. Một điểm cộng lớn với SysV là khả năng xác định các lệnh tùy chỉnh để cung cấp chức năng tốt hơn để quản lý các quy trình. Với systemd, không có tùy chọn nào như vậy và bạn có thể bị kẹt khi bắt đầu, dừng, trạng thái, khởi động lại, v.v..

Chỉ dành cho gia đình và không tương tác

systemd (tất nhiên) theo dõi các quá trình mà nó đã đưa ra và lưu trữ các PID của chúng. Tuy nhiên, thách thức là systemd không thể xử lý các tiến trình không được khởi chạy bởi nó. Hơn nữa, người dùng không thể tương tác với một quá trình được bắt đầu bởi systemd. Tất cả đầu ra chuyển sang / dev / null, thực sự dừng lại ở bất kỳ hy vọng nào mà bạn có thể đã nắm bắt được đầu ra.

Không có ngữ cảnh

Không giống như các dịch vụ init, những dịch vụ được khởi chạy bởi systemd không kế thừa bất kỳ môi trường nào từ bất kỳ người dùng nào trong hệ thống. Nói cách khác, thông tin như PATH và các biến hệ thống khác không có sẵn, và mọi quy trình mới được đưa ra trong một bối cảnh trống rỗng.

Nếu danh sách giới hạn này khiến bạn khóc, một lần nữa, bạn không đơn độc. systemd đã trở thành một lực lượng phân cực trong thế giới Linux và Googling trên hệ thống hút máu hệ thống sẽ khai quật được nhiều tài liệu đọc. ��

Cách khởi động dịch vụ tự động khi xuống?

Ở đây, một trường hợp sử dụng khá phổ biến trong triển khai. Chúng ta cần tạo ra một chương trình bằng ngôn ngữ không có quy trình chạy dài: PHP! Giả sử tôi viết một tập lệnh PHP để xử lý các kết nối websocket đến (sau tất cả chúng tôi đã xây dựng một ứng dụng trò chuyện!) Và tập lệnh được đặt tại /home/ankush/chat_server/index.php.

Vì các kết nối websocket có thể tấn công máy chủ bất cứ lúc nào, quá trình này cần phải được cập nhật mọi lúc và theo dõi các kết nối đến. Chúng ta có thể có vòng đời PHP truyền thống ở đây vì WebSockets là các kết nối có trạng thái và nếu tập lệnh chết, kết nối là một danh sách. Dù sao, đủ trên websockets; hãy để chúng tôi xem cách chúng tôi sẽ tiến hành trình diễn kịch bản này qua systemd.

Tất cả các dịch vụ systemd đều nằm trong / etc / systemd / system, vì vậy, hãy tạo ra một tập tin ở đó để mô tả tập lệnh máy chủ websocket của chúng tôi. Giả sử bạn đã đăng nhập với tư cách người dùng root.

# vi /etc/systemd/system/chat_server.service

và sau đó là cần thiết.

[Đơn vị]
Mô tả = Dịch vụ máy chủ trò chuyện
Sau = mạng.target

[Dịch vụ]
Loại = đơn giản
Người dùng = mắt cá chân
ExecStart = php /home/ankush/chat_server/index.php
Khởi động lại = hủy bỏ

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

Lưu tệp và bước tiếp theo là tải lại daemon systemd

# systemctl daemon-tải lại

và để bắt đầu dịch vụ chúng tôi vừa tạo:

# systemctl bắt đầu chat_server

Nếu bạn thấy không có lỗi, đó là nó!

Hãy để nhanh chóng xem xét các chỉ thị khác nhau trong tệp có nghĩa là gì:

  • Phần [Đơn vị] xác định đơn vị dịch vụ mới cho systemd. Theo cách nói của systemd, tất cả các dịch vụ được gọi là các đơn vị dịch vụ.
  • Lệnh After (dự đoán) sẽ bảo systemd chỉ khởi chạy dịch vụ này sau khi các dịch vụ mạng được khởi chạy (nếu không, ai sẽ thực hiện việc xử lý các kết nối ổ cắm ở mức thấp hơn?!).
  • Loại = đơn giản nói với systemd rằng dịch vụ này không phải là chính nó. Nói cách khác, chỉ có một phiên bản sẽ chạy bất kỳ thời gian nào.
  • Người dùng = ankush có nghĩa là dịch vụ này sẽ chạy như người dùng. Chúng tôi có thể thay đổi điều này thành root root, nhưng nó rất không được khuyến khích từ góc độ bảo mật.
  • ExecStart, như bạn có thể nói, là lệnh thực tế để chạy.
  • Khởi động lại = on-abort có nghĩa là dịch vụ sẽ được khởi động lại khi nó hủy bỏ. Trong PHP, các quá trình chạy dài bị rò rỉ bộ nhớ và cuối cùng phát nổ, vì vậy điều này là cần thiết.
  • Lệnh WantedBy = chỉ thị cho systemd mục tiêu nào (nghĩ về các nhóm) dịch vụ này là một phần của. Điều này dẫn đến các liên kết tượng trưng được tạo bên trong mục tiêu đó để trỏ đến dịch vụ.

Nói chung, số tiền này là đủ để chạy các quy trình nền sử dụng systemd trong RHEL 7.

Tùy chọn khác để khởi động lại logic

Trong ví dụ trên, tôi đã cấu hình Restart = on-abort nhưng đó không phải là lựa chọn duy nhất. Có nhiều hơn và lựa chọn dựa trên yêu cầu.

  • thất bại – sẽ được khởi động lại khi mã thoát không rõ ràng hoặc tín hiệu
  • luôn luôn – khởi động lại khi tìm thấy xuống, tín hiệu sạch hoặc ô uế
  • bất thường – tín hiệu ô uế, cơ quan giám sát hoặc thời gian chờ
  • thành công – chỉ khi nó bị dừng bởi tín hiệu sạch hoặc mã thoát

Cấu hình dịch vụ để khởi động khi khởi động

Khi bạn hài lòng với tập lệnh và đảm bảo nó hoạt động, tiếp theo bạn muốn định cấu hình để tập lệnh khởi động và khởi động.

Truy cập / etc / systemd / system và thực thi lệnh enable bên dưới (đừng quên thay đổi tên tệp .service bằng tên bạn có)

# systemctl kích hoạt chat_server.service

Bạn sẽ thấy một xác nhận rằng nó đã tạo ra một liên kết tượng trưng.

Đã tạo liên kết tượng trưng từ /etc/systemd/system/multi-user.target.wants/chat_server.service đến /etc/systemd/system/chat_server.service.

Khởi động lại máy chủ của bạn và bạn sẽ thấy dịch vụ bắt đầu khi khởi động.

Điều đó thật dễ dàng! Nó không phải là nó?

Cứu giúp! Tôi đầu tư ồ ạt vào Upstart. ��

Tôi hiểu bạn tin tưởng tôi, trường hợp của bạn là tiêu chuẩn chứ không phải là ngoại lệ. RHEL đã sử dụng Upstart quá lâu đến nỗi công tắc gần như cảm thấy như một sự phản bội. Nhưng này, các hệ thống liên tục thay đổi, và chúng ta không nên chiến đấu với những chuyện vặt vãnh. Red Hat nhận ra rằng nhiều người bị mắc kẹt với các phiên bản cũ hơn và đã tạo ra một hướng dẫn di chuyển mà bạn chắc chắn nên tham khảo.

Một ưu điểm tiết kiệm trong tất cả những điều này là systemd tương thích với các tập lệnh init SysV, vì vậy, đối với hầu hết các phần, bạn chỉ cần di chuyển các tệp của mình và chạy các dịch vụ tương tự.

Quan tâm đến việc tìm hiểu thêm về Quản trị và Khắc phục sự cố Linux? Kiểm tra này khóa học trực tuyến.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map