Tại sao đơn vị Systemd của tôi được tải, nhưng không hoạt động (đã chết)?


29

Tôi đang cố gắng thiết lập Graphite trên máy chủ của mình. Tôi có thể khởi động trình nền Carbon Cache không có vấn đề gì sudo /opt/graphite/bin/carbon-cache.py start, nhưng tôi đang vật lộn để chạy nó dưới dạng một đơn vị Systemd.

Đây là những gì tôi có trong tệp dịch vụ của mình , graphite.service:

[Unit]
Description=Carbon for Graphite

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py start

[Install]
WantedBy=multi-user.target

Nhưng khi tôi bắt đầu đơn vị, tôi nhận được trạng thái sau:

$ systemctl status graphite.service            
* graphite.service - Carbon for Graphite
   Loaded: loaded (/etc/systemd/system/graphite.service; enabled)
   Active: inactive (dead) since Fri 2014-06-13 18:44:11 UTC; 2s ago
  Process: 4525 ExecStart=/opt/graphite/bin/carbon-cache.py start (code=exited, status=0/SUCCESS)
 Main PID: 4525 (code=exited, status=0/SUCCESS)

Jun 13 18:44:11 MEADOW systemd[1]: Started Carbon for Graphite.

Tạp chí không mang lại nhiều thông tin.

Làm cách nào để diễn giải và gỡ lỗi các đơn vị có trạng thái "không hoạt động (đã chết) ... (code = exited, status = 0 / SUCCESS)"? Tôi đã thấy các đơn vị thất bại trước đây, nhưng đơn vị này đã được tải thành công nhưng không chạy và tôi không biết điều đó có nghĩa là gì.


4
Nó có nghĩa là systemd đã hoàn thành công việc của nó. Không nên có một Type=lựa chọn? Xem man systemd.servicecho một loại thích hợp.
jasonwryan

1
Điều đó có ý nghĩa. Tất cả tôi phải làm là thêm Type=forkingvào [Service]phần.
Ryne Everett

Câu trả lời:


26

Theo nhận xét của jasonwryan, trong khi mặc định Type=simplehoạt động cho nhiều tệp dịch vụ Systemd, nó không hoạt động khi tập lệnh ExecStartkhởi chạy một quy trình khác và hoàn thành, như trường hợp với carbon-cache.py của than chì. Trong những trường hợp này, bạn cần chỉ định rõ ràng Type=forkingtrong [Service]phần để Systemd biết để xem xét quá trình sinh ra thay vì quy trình ban đầu.

Như đã giải thích trong man systemd.service:

Nếu được đặt thành forking, dự kiến ​​quy trình được cấu hình với ExecStart = sẽ gọi fork () là một phần của quá trình khởi động. Quá trình cha mẹ dự kiến ​​sẽ thoát khi khởi động hoàn tất và tất cả các kênh truyền thông được thiết lập. Đứa trẻ tiếp tục chạy như là quá trình daemon chính. Đây là hành vi của daemon UNIX truyền thống. Nếu cài đặt này được sử dụng, bạn cũng nên sử dụng tùy chọn PIDFile = để systemd có thể xác định quy trình chính của daemon. systemd sẽ tiến hành bắt đầu các đơn vị theo dõi ngay khi tiến trình cha mẹ thoát ra.

Câu trả lời cụ thể về than chì

Trong khi những điều trên đã giải quyết được vấn đề Systemd của tôi, tôi đã nhanh chóng gặp phải các vấn đề cụ thể về than chì (với Twisted) và cuối cùng trở lại mặc định Type.

Than chì <0,9,12

Trong các phiên bản trước của Graphite, người ta chỉ có thể tránh bị rách bằng cách sử dụng --debugtùy chọn:

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py --debug start

Than chì> = 0,9,13

Trong yêu cầu kéo này, một --no-daemontùy chọn đã được hợp nhất:

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py --no-daemon start
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.