Sự khác biệt giữa systemctl init.d và dịch vụ


39

Tôi mới sử dụng linux và đã tự kiểm tra bằng cách sử dụng phiên bản Amazon Lightsail (Ubuntu 16.04 LTS).

Đi qua nhiều hướng dẫn tôi đã gặp, tôi thấy mọi người sử dụng các lệnh khác nhau để bắt đầu / dừng / khởi động lại / tải lại / kiểm tra trạng thái một dịch vụ. Cụ thể những điều này;

sudo systemctl status apache2.service
sudo /bin/systemctl status apache2.service
sudo /etc/init.d/apache2 status
sudo service apache2 status

Tất cả các lệnh trên hoạt động.

  1. Tôi có nên thích một lệnh hơn lệnh kia không?
  2. Nếu có thì tại sao?
  3. Có bất kỳ lệnh nào khác tôi cần phải nhận thức?

Việc sử dụng init.d trong Monit gây ra sự cố khi tôi muốn sử dụng tùy chọn trạng thái (trạng thái sẽ là dịch vụ ngoại tuyến khi thực sự trực tuyến - được khởi động lại bởi Monit). Thay đổi mã trong Monit từ inid.d thành / bin / systemctl đã sửa nó.

Có vẻ như việc sử dụng init.d cung cấp thêm thông tin về những gì đã xảy ra với những người khác. Nếu tôi nên sử dụng một trong các lệnh khác, liệu chúng có thể hiển thị thêm thông tin về những gì đã được thực hiện không?

ubuntu@ip-172-26-12-245:~$ sudo systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /bin/systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /etc/init.d/pure-ftpd restart
[ ok ] Restarting pure-ftpd (via systemctl): pure-ftpd.service.
ubuntu@ip-172-26-12-245:~$ sudo service pure-ftpd restart
ubuntu@ip-172-26-12-245:~$

Tôi muốn cảm ơn tất cả mọi người trước đã dành thời gian để đọc và trả lời câu hỏi này.


Trong Linux thường có nhiều cách để thực hiện một hành động. Không có cái nào tốt hơn hay xấu hơn hay đúng hay sai. Cá nhân tôi sử dụng một trong những ít gõ nhất. Nhiều trong số các lệnh này có thể là liên kết sym hoặc tương thích ngược khi Ubuntu thay đổi thành systemd.
Panther

systemctllà cú pháp ưa thích và serviceđược cung cấp dưới dạng tương thích ngược. /etc/init.d/pure-ftpdhoặc tương tự đang gọi các kịch bản bắt đầu / dừng trực tiếp.
Panther

Câu trả lời:


57

Để bắt đầu, có cả một lịch sử và cuộc đấu tranh giữa đi từ SysVInitđến SystemD. Thay vì cố gắng chia nhỏ tất cả trong một câu trả lời, tôi sẽ giới thiệu cho bạn một số mạo hiểm của google để biết thêm chi tiết về lịch sử cũng như một bài viết cụ thể về chủ đề này:

http://www.tecmint.com/systemd-replaces-init-in-linux/

Tóm lại, đó là một quá trình chuyển đổi chậm và khó khăn. Một số tính năng di sản đã được giữ nguyên (chẳng hạn như init.dở một mức độ nào đó). Nếu bạn có tùy chọn sử dụng systemctlđể kiểm soát dịch vụ của mình, tôi khuyên bạn nên sử dụng điều khiển đó. Đó là tương lai có thể thấy trước đối với Linux và cuối cùng các SysVInitphương thức cũ hơn sẽ bị coi là không dùng nữa và bị loại bỏ.

Để bao gồm từng người bạn liệt kê cụ thể:

  1. sudo systemctl status apache2.service

Đây là SystemDcách tiếp cận mới để xử lý các dịch vụ. Tiến về phía trước, các ứng dụng trên Linux được thiết kế để sử dụng phương thức systemd chứ không phải bất kỳ ứng dụng nào khác.

  1. sudo /bin/systemctl status apache2.service

Đây là điều tương tự như lệnh trước. Sự khác biệt duy nhất trong trường hợp này là nó không phụ thuộc vào $PATHbiến môi trường của shell để tìm lệnh, nó liệt kê rõ ràng lệnh bằng cách bao gồm đường dẫn đến lệnh.

  1. sudo /etc/init.d/apache2 status

Đây là SysVInitphương pháp ban đầu để gọi trên một dịch vụ. Các kịch bản ban đầu sẽ được viết cho một dịch vụ và được đặt vào thư mục này. Mặc dù phương thức này vẫn được nhiều người sử dụng, nhưng đó servicelà lệnh thay thế phương thức gọi dịch vụ này SysVInit. Có một số chức năng kế thừa cho điều này trên các hệ thống mới hơn SystemD, nhưng hầu hết các chương trình mới hơn không bao gồm điều này và không phải tất cả các tập lệnh init ứng dụng cũ đều hoạt động với nó.

  1. sudo service apache2 status

Đây là công cụ chính được sử dụng trên SysVInitcác hệ thống cho các dịch vụ. Trong một số trường hợp, nó chỉ liên kết với các /etc/init.d/tập lệnh, nhưng trong các trường hợp khác, nó đã chuyển đến một tập lệnh init được lưu trữ ở nơi khác. Nó được dự định để cung cấp một sự chuyển tiếp mượt mà hơn vào việc xử lý phụ thuộc dịch vụ.


Cuối cùng, bạn đề cập đến việc muốn biết cách lấy thêm thông tin từ các lệnh, vì một số cung cấp nhiều thông tin hơn các lệnh khác. Điều này hầu như luôn được xác định bởi ứng dụng và cách họ thiết kế tệp init hoặc dịch vụ của họ. Như một quy luật chung, nếu nó hoàn thành âm thầm, nó đã thành công. Tuy nhiên, để xác minh a start, stophoặc restart, bạn có thể sử dụng lệnh statusphụ để xem cách thực hiện. Bạn đã đề cập đến một statuslệnh không chính xác trên một tập lệnh init cũ. Đó là một lỗi mà các nhà phát triển ứng dụng sẽ phải xem xét. Tuy nhiên, vì các tập lệnh init đang trở thành phương thức xử lý các dịch vụ không dùng nữa, chúng có thể bỏ qua lỗi cho đến khi chúng loại bỏ hoàn toàn tùy chọn tập lệnh init. Cácsystemctl status phải luôn hoạt động chính xác nếu không một lỗi sẽ được ghi lại với các nhà phát triển ứng dụng.


Cảm ơn bạn rất nhiều vì đã trả lời chi tiết của bạn. Tôi cũng đang tìm kiếm câu trả lời nhưng điều này thực sự làm tôi bối rối, vì vậy tôi đã đăng nó ở đây. Tôi cũng thấy rằng trạng thái sudo systemctl apache2 hoạt động, thay vì (sudo systemctl status apache2.service). Có một tác hại trong việc từ bỏ phần .service không?
Waqas Tariq

@WaqasTariq không có vấn đề! Cả hai đều hoạt động, systemctlsẽ tìm kiếm các thư mục nơi các tệp dịch vụ được lưu trữ và thêm ".service" cho bạn nếu nó tìm thấy nó. Vì vậy, ví dụ, nếu bạn nhấn tab một lần sau khi chỉ viết sudo systemctl status apache2thì nên hoàn thành nó bằng cách thêm .servicecho bạn. Nếu có nhiều hơn một tệp hệ thống apache2 (chẳng hạn như .service.targetbạn phải nhấn tab hai lần để nó hiển thị cho bạn tất cả các tùy chọn có sẵn.
TopHat

Hiểu rồi. Cảm ơn bạn đã trả lời và thời gian của bạn.
Waqas Tariq

@WaqasTariq chào mừng bạn!
TopHat
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.