Có cách nào chuẩn để bắt đầu và dừng dịch vụ trên Linux không?


15

Cho đến gần đây, có một cách đơn giản và hiệu quả để bắt đầu / dừng / khởi động lại dịch vụ:

service nginx start|stop|restart

Điều này hoạt động hoàn hảo trong nhiều năm, ... cho đến khi một số quần thông minh quyết định cải thiện chúng và bây giờ tôi phải đối mặt với các hệ thống Debian / Ubuntu mà servicekịch bản không làm gì cả (vì tôi phải sử dụng những thứ như systemctl start nginx.service(lâu hơn nhiều, không tự động hoàn thành, ...)

Câu hỏi của tôi đặc biệt liên quan đến Debian và Ubuntu nhưng cũng rất hữu ích để bao gồm các bản phân phối CentOS / RedHat.

Vì vậy, có điều gì có thể cứu tôi khỏi những thay đổi cam chịu này?

Trong trường hợp không rõ ràng, tôi đang tìm kiếm một cách nhất quán để đối phó với những thứ đó, một cách sẽ hoạt động trên Debian 7.x, 8.x, Ubuntu LTS mới nhất và không phải LTS.

Tái bút Ngoài phạm vi của câu hỏi cụ thể này, nhưng số tiền thêm được cấp nếu giải pháp cũng sẽ bao gồm phần bật và tắt cho các dịch vụ.


5
Hoàn thành tab hoạt động cho systemctl đối với tôi ... Và, dù muốn hay không, systemd tiêu chuẩn thực tế hiện nay: cũng có thể quen với nó.
jasonwryan

1
Thêm: nếu lệnh dịch vụ trở nên vô dụng, tôi có thể xóa nó không? Gói gì cung cấp cho nó?
sorin

3
Không có ý nghĩa để thay thế servicelệnh cũ bằng một trình bao bọc gọi servicectl thay thế?
sorin

4
@jasonwryan Có, nhưng bạn cũng có thể làm điều đó và một trình bao bọc có thể xử lý nó, giúp việc chuyển đổi sang systemd mượt mà hơn cho người dùng.
Dmitry Grigoryev

2
servicethực sự không làm gì cho bạn? Nó hoạt động như mong đợi trên LMDE của tôi (về cơ bản là thử nghiệm Debian), tôi không nghĩ đó là một thứ dành riêng cho LMDE. Nó cũng hoạt động như mong đợi trong Ubuntu VM của tôi.
terdon

Câu trả lời:


6

Đã có một số hệ thống kiểm soát khởi động và dịch vụ khác nhau trên các nền tảng Unix trong lịch sử rối rắm của nó.

Các service\chkconfighệ thống dựa bạn tìm thấy đơn giản và hiệu quả thường được gọi là SysVinit phong cách và là một bước tiến quan trọng dọc theo con đường để một số loại tiêu chuẩn hóa. Bạn sẽ tìm thấy kiểu khởi động này trên RHEL / CentOS (EL) thông qua phiên bản 6, Fedora đến 14 và trên các bản phân phối dựa trên Debian / Ubuntu cho đến năm 2015. Đây không phải là hệ thống khởi động duy nhất xung quanh, kiểu BSD (đơn giản hơn) hệ thống init vẫn còn nhiều người hâm mộ.

SysVinit không phải là một giải pháp hoàn hảo (là gì?) Và Systemd đã nghĩ ra cách khắc phục nhiều vấn đề; đây là systemctlhệ thống dựa trên lệnh mà bạn hiện đang trải nghiệm. Mặc dù nó không được yêu thích trên toàn cầu (mọi người ghét thay đổi, phình to, v.v.), không có nghi ngờ gì rằng nó nhanh chóng trở thành tiêu chuẩn defacto trên phần lớn các bản phân phối.

Do đó, việc tìm kiếm ngay câu trả lời cho câu hỏi ban đầu của bạn chỉ đơn giản là:
Cách tiêu chuẩn để kiểm soát các dịch vụ trên hầu hết các bản phân phối Linux là ngay bây giờ systemctl!
Điều này sẽ đúng trong bao lâu là phỏng đoán của bất kỳ ai; có lẽ chỉ cho đến khi một cái gì đó đi cùng là tốt hơn và được chấp nhận rộng rãi.

Tôi chắc chắn sẽ có các trình bao bọc có sẵn để cho phép, yêu thích hiện tại của bạn, các service/chkconfiglệnh tiếp tục thực hiện hầu hết mọi thứ lành mạnh, nhưng với đường cong học tập đặc biệt này, có lẽ tốt nhất là không nên chiến đấu với nó. Có thể mong đợi, trong một thời gian cũng sẽ có các systemctltrình bao bọc cho các hệ thống cũ hơn, để làm cho việc quản lý chúng cùng với các hệ thống hiện tại ít gây đau đớn hơn;)


Và trước đó là xinetd, và trước đó là inetd
jas-

@ jas- Tôi nghĩ rằng inetd thực sự là dịch vụ, tôi tin rằng chúng có thể tồn tại trong tất cả các hệ thống khởi động. Chúng là một loại dịch vụ đặc biệt ở chỗ chúng cung cấp một sự thay thế cho một số dịch vụ khác để chạy dưới dạng dịch vụ đầy đủ, thay vào đó cung cấp chúng theo yêu cầu . Tôi hiểu bạn đến từ đâu trong bối cảnh của Q này, chỉ là một cách khác để bắt đầu dịch vụ.
DanSut

Trong tất cả các bản phân phối; gentoo, centos, redhat, debian, ubfox, v.v., xinetd và inetd trước đó bao gồm tập lệnh shell nhỏ để bắt đầu, dừng và tải lại cấu hình cho các dịch vụ khác nhau, nhưng đúng vậy, bạn thực sự là một dịch vụ giống như systemd.
jas-

Ubuntu đã sử dụng từ lúc bắt đầu từ 6.10 và Fedora kể từ ngày 9 (cho đến khi chúng được thay thế bởi systemd) upstart.ub Ubuntu.com và có thể chuyển Debian khỏi sysvinit trong vài năm ...
James Tocknell

5

Không [nó] có ý nghĩa để thay thế servicelệnh cũ bằng một trình bao bọc gọi servicectl[sic] thay vào đó?

Có, nhưng [Hoài] một trình bao bọc có thể xử lý nó, giúp quá trình chuyển đổi sang systemd mượt mà hơn cho người dùng.

Đó là, như những người khác đã nói trong các ý kiến, những gì đã được thực hiện từ lâu .

Các /usr/sbin/servicelệnh trên Debian 8 là một phần của gói sysvinit-utils. Nó đã xuất hiện từ năm 2009. Đây là một bổ sung có nguồn gốc RedHat dành riêng cho Debian cho gói nguồn sysvinit ban đầu và có thể thấy khi đọc tập lệnh, nó nhận ra cả hệ thống đang chạy và sự hiện diện của các công việc mới bắt đầu, đưa ra các lệnh systemctlinitctl( thông qua các bí danh của nó) tương ứng. Điều này nó đã được thực hiện từ năm 2013.

service name actionlà khá phổ biến ngay cả trên các hệ điều hành không phải là Linux. Nó thậm chí sẽ hoạt động trên hầu hết các BSD, vì chúng cũng có các servicelệnh riêng . Ngoài ra còn có một servicelệnh shim trong gói nosh dịch . Nhưng …system-control action name

  • Vượt ra ngoài tập hợp con phổ biến này, và có rất ít khả năng tương thích xung quanh.
  • Cấm OpenBSD không có servicelệnh.
  • Các servicelệnh BSD có các vấn đề nổi tiếng từ lâu mà các quản trị viên hệ thống đã kể những câu chuyện chiến tranh trong nhiều thập kỷ.

Kích hoạt và vô hiệu hóa các dịch vụ là một tình huống tương tự. Mặc dù chkconfigchương trình SuSE (có sẵn cho Debian và Ubuntu) rất khác với chương trình Fedora (chúng được viết bằng các ngôn ngữ lập trình hoàn toàn khác nhau, thậm chí - một được biên dịch, một được giải thích), có một cú pháp tối thiểu chung , với hành động là hoặc . Nhưng …chkconfig name actiononoff

  • Một lần nữa, ngoài tập hợp con phổ biến này có ít khả năng tương thích.
  • Không có chkconfigtrên BSD, vì các công cụ thông thường cho việc này là sysrchoặc OpenBSD gần đây rcctl enablercctl disable. Có chkconfigrcctlmiếng chêm trong gói nosh dịch sang và .system-control enable namesystem-control disable name
  • Chỉ có Fedora chkconfigbiết về systemd và hoạt động như một shim cho systemctl enablesystemctl disable. SuSE chkconfigkhông có kiến ​​thức về systemd.

đọc thêm


2

Không có cách chuẩn để bắt đầu và dừng dịch vụ trên Linux.

Có điều gì có thể cứu tôi khỏi những thay đổi cam chịu này không?

Hãy thử công cụ quản lý cấu hình / điều phối: Ansible , Chef , Saltstack , Puppet hoặc bất cứ thứ gì.

Bạn có thể bắt đầu và kích hoạt dịch vụ với Ansible:

ansible all -i inv -m service -a 'name=service-name state=started enabled=true'

Hãy xem lớp LinuxService trong servicemô-đun của Ansible :

Đây là lớp thao tác dịch vụ Linux - hiện đang hỗ trợ hỗn hợp nhị phân và tập lệnh init để kiểm soát các dịch vụ bắt đầu khi khởi động, cũng như để kiểm soát trạng thái hiện tại.


Bằng cách nào đó, dường như các chàng trai Ubuntu đã có thể giữ cho tập lệnh dịch vụ hoạt động sau khi chuyển sang systemd. Nhìn vào bên trong nó có vẻ đủ thông minh để sử dụng đúng phụ trợ. Không thể nói như vậy về Debian.
sorin



1

Vấn đề của bạn là Debian / Ubuntu đã chuyển sang cái mới systemdthay thế cái cũ sysvinit. Hỏi xem cái nào tốt hơn và bạn sẽ bắt đầu một cuộc chiến rực lửa, nhưng bạn có thể luôn quay trở lại cái cũ sysvinit, kiểm tra cái này nếu bạn muốn quay lại.

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.