thông báo trạng thái tùy chỉnh systemd?


7

Tôi đang cố gắng viết một dịch vụ systemd sẽ hiển thị các tùy chọn start|stop|status|restart.

Đây là kịch bản hiện tại:

[Unit]
Description=Daemon to start ark server
After=network.target

[Service]
ExecStart=/etc/init.d/arkdaemon start
ExecStop=/etc/init.d/arkdaemon stop
Type=forking

[Install]
WantedBy=multi-user.target

Tôi không thể tìm thấy bất kỳ cách nào để chỉ định một lệnh trạng thái tùy chỉnh.
Có một cách tôi nghĩ, nhưng làm thế nào?

Câu trả lời:


5

Systemd hỗ trợ thông báo trạng thái tùy chỉnh, nhưng đây là một số điều kiện tiên quyết phải được đáp ứng:

  • loại dịch vụ nên notify
  • dịch vụ của bạn phải cập nhật systemd với trạng thái dịch vụ hiện tại của bạn thông qua /run/systemd/notifyổ cắm hoặc bằng cách gọi systemd-notify

Để tham khảo, bạn có thể kiểm tra Apache HTTPD trên Fedora (có thể giống với các bản phát hành khác, không biết):

systemctl status httpd.service


● httpd.service - The Apache HTTP Server    
  Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Active: active (running) since Fri 2017-10-06 15:21:07 CEST; 18h ago
  Docs: man:httpd.service(8)
  Process: 14424 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)  
  Main PID: 4105 (httpd)
  Status: "Total requests: 8; Idle/Busy workers 100/0;Requests/sec: 0.000118; Bytes served/sec:   0 B/sec"

Bạn có thể thấy rằng Apache đang báo cáo trạng thái là Tổng số yêu cầu: 8; Công nhân nhàn rỗi / bận rộn 100/0

Vì vậy, khi tôi đính kèm stracetrên pid 4105, chúng ta có thể thấy rằng đó là định kỳ gửi các cập nhật trạng thái tới systemd:

sudo strace -f -p 4105

wait4(-1, 0x7ffcfab4a25c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {tv_sec=1, tv_usec=0}) = 0 (Timeout)
socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 8
getsockopt(8, SOL_SOCKET, SO_SNDBUF, [212992], [4]) = 0
setsockopt(8, SOL_SOCKET, SO_SNDBUFFORCE, [8388608], 4) = 0
sendmsg(8, {msg_name={sa_family=AF_UNIX, sun_path="/run/systemd/notify"}, msg_namelen=21, msg_iov=[{iov_base="READY=1\nSTATUS=Total requests: 8"..., iov_len=110}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 110
close(8)                                = 0
wait4(-1, 0x7ffcfab4a25c, WNOHANG|WSTOPPED, NULL) = 0

Bạn có thể thấy rằng nó đang gửi READY = 1 \ nSTATUS = Tổng số yêu cầu: 8 ... vào ổ cắm/run/systemd/notify

Đề nghị đọc

man systemd-notify

hoặc tài liệu chính thức .

Ví dụ: Khởi động dịch vụ trong Systemd


9

Tôi đang cố gắng viết một dịch vụ systemd sẽ hiển thị các tùy chọn start|stop|status|restart.

Lỗi đầu tiên của bạn. Các đơn vị dịch vụ không phải là kịch bản. Họ không lựa chọn. Các tùy chọn là theo systemctllệnh và chúng thống nhất trên tất cả các đơn vị.

Tôi nhận ra rằng việc sử dụng centos dường như là không chuẩn,

Lỗi thứ hai của bạn, liên quan đến lỗi thứ ba của bạn:

Tôi sẽ hợp nhất một PR để sửa nhiều thứ trong debian / ubfox. sau đó chúng ta sẽ phải viết một daemon thay thế cho centos, bởi vì nó sử dụng một phương thức init khác.

CentOS không phải là một trong những lẻ. Ubuntu phiên bản 15, Debian 8 và CentOS 7 đều sử dụng systemd và tất cả đều cần một đơn vị dịch vụ systemd thích hợp.

ExecStart = / etc / init.d / arkdaemon bắt đầu
ExecStop = / etc / init.d / arkdaemon dừng

Sai lầm thứ tư của bạn. Bạn không viết các đơn vị dịch vụ bằng cách chuyển mọi thứ sang rctập lệnh Hệ thống 5 . Ngoài thực tế là nó sẽ không hoạt động trên Debian và Ubuntu, vì họ cố gắng đẩy mọi thứ trở lại đơn vị dịch vụ; đó là một nỗi kinh hoàng của một khái niệm, xứng đáng là một mục trong nhà kinh dị hệ thống. Nhìn vào rctập lệnh Hệ thống 5 , nó đặt lại tất cả những điều vô nghĩa sai lầm - không phù hợp với đầu ra của psviệc sử dụng sai sudođể bỏ các đặc quyền (thay vì có được chúng) - việc chuyển sang một trình quản lý dịch vụ phù hợp sẽ bị loại bỏ.

Đừng nhầm lẫn xung quanh một cách ngẫu nhiên. Hiểu cách thức hoạt động của bạn , và sau đó viết một đơn vị dịch vụ mô tả điều đó.

Bạn Hệ thống 5 rckịch bản gọi một chương trình mang tên arkmanagervới startstopđộng từ. Vì vậy, lúc đầu, người ta có thể nghĩ rằng một đơn vị dịch vụ systemd cũng nên. Nhưng hóa ra, arkmanager chính nó vẫnmột Người giám sát Dmon của Người nghèo khác được viết (tệ như mọi khi) trong kịch bản shell, tất cả đều vô nghĩa và nhiều hơn nữa - lấy đầu ra của ps, sử dụng screen(sic!) Như một cách để loại bỏ một quá trình và sau đó gửi SIGINTnó tới nó, duy trì tệp nhật ký (không xoay) của chính nó và sử dụng các chuỗi CSI cứng (sic!) trong một chương trình mà khi quản lý một dæmon không được chạy kết nối với thiết bị đầu cuối trong nơi đầu tiên

Bạn đang bận rộn xây dựng một nỗi kinh hoàng khác. Dừng lại.

Tước đi tòa lâu đài khủng khiếp có một Người giám sát D Poormon của Người nghèo giám sát người khác, đến lượt họ lạm dụng screenvới tư cách là người giám sát quảng cáo thứ ba, người ta thấy rằng quản lý dịch vụ cơ bản thực sự trông giống như thế này:

[Đơn vị]
Mô tả = máy chủ ARK
Tài liệu = https: //unix.stackexchange.com/questions/212059/
Sau = mạng.target

[Dịch vụ]
Người dùng = hơi nước
Môi trường = SESSION = YourLinuxSessionName
Môi trường = QUERYPORT = 27016
Môi trường = PASS = mật khẩu
Môi trường = ADMINPASS = mật khẩu quản trị
ExecStart = / home / steam / ARK / ShooterGame / Binaries / Linux / ShooterGameServer TheIsland? SessionName = $ {SESSION}? QueryPort = $ {QUERYPORT}? ServerPassword = $ {PASS}? ServerAdminPassword = $ {ADMIN?
Giới hạnNOFILE = 100000
Khởi động lại = luôn

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

Và quy tắc đầu tiên của việc chuyển sang systemd là gì? Đúng rồi. Bây giờ là năm 2015, và ai đó rất có thể đã thực hiện nó. Và thực sự ở đây, ai đó đã có, đánh bại tôi 4 ngày. Họ cũng không xây dựng một nỗi kinh hoàng.

đọc thêm


thực ra bạn đã nhìn vào nhánh chính, chúng tôi đã cải thiện nó khá nhiều trong nhánh 1.1
Fez Vrasta

"Tôi nhận ra việc sử dụng centos dường như là không chuẩn", có liên quan đến thực tế là các nhà phát triển ARK đề nghị sử dụng Ubuntu 14.04. Bạn nói mà không biết bối cảnh ở đây.
Fez Vrasta

"Tôi sẽ hợp nhất một PR để sửa chữa nhiều thứ trong debian / ubfox. Sau đó, chúng tôi sẽ phải viết một daemon thay thế cho centos, bởi vì nó sử dụng một phương thức init khác." Ở đây, tôi đã nói về Ubuntu 14.04 và CentOS 6.6, và vâng, Ubuntu 14.40 sử dụng một tập lệnh init khác nhau, sau đó là một trong CentOS 6.6
Fez Vrasta

2
@JdeBP Tôi không thực sự thích câu trả lời của bạn, dường như tôi khá khó chịu nếu không có câu trả lời thích đáng, trong một câu, người ta có thể gọi systemctl status ...để lấy trạng thái ...
Betlista
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.