2015-06-25 16 views
14

Tôi có một dịch vụ systemd đơn giản cần phải được khởi động lại định kỳ để giữ cho quy trình của nó không bị lỗi. Có tùy chọn cấu hình cho các dịch vụ systemd để khởi động lại chúng theo định kỳ không? Tất cả các Restart* options dường như liên quan đến việc khởi động lại dịch vụ khi nó thoát.Làm cách nào để định cấu hình dịch vụ systemd để khởi động lại định kỳ?

Trả lời

18

Có, bạn có thể làm cho dịch vụ của bạn khởi động lại định kỳ bằng cách thực hiện dịch vụ Type=notify. Thêm tùy chọn này trong phần [Dịch vụ] của tệp dịch vụ của bạn cùng với Restart=always và cung cấp WatchdogSec=xx, trong đó xx là khoảng thời gian trong giây bạn muốn khởi động lại dịch vụ của mình. Ở đây quá trình của bạn sẽ bị giết bởi systemd sau khoảng thời gian xx và sẽ được khởi động lại bởi systemd một lần nữa. ví dụ:

[Unit] 
. 
. 

[Service] 
Type=notify 
. 
. 
WatchdogSec=10 
Restart=always 
. 
. 

[Install] 
WantedBy= .... 
+4

Thông minh! FWIW 'type = notify' là không cần thiết cho dịch vụ di sản câm của tôi mà chỉ lỗi sau một thời gian. Tuy nhiên, việc thiết lập 'WatchdogSec' với' Type = simple' cũng giống nhau. – wes

+4

Vấn đề với 'WatchdogSec'' là nó sẽ gửi một SIGABRT (gây ra một dump cốt lõi) mỗi khi nó khởi động lại. Bên cạnh việc chấm dứt không rõ ràng quá trình, nó cũng có thể lấp đầy đĩa gốc của bạn với coredumps cuối cùng. – bk0

+1

@wes cảm ơn, 'Type = notify' không làm cho dịch vụ bắt đầu với tôi,' Type = 'simple' hoạt động tốt (thực sự không có bất kỳ' Type' nào hoạt động tốt, có lẽ đơn giản là mặc định 'Type') – WonderLand

3

Chỉ cần một số phương pháp thay thế để cuối cùng đạt được mục tiêu giống nhau:

  • nếu bạn có thể kiểm soát việc thực hiện dịch vụ mà bạn có thể làm cho nó chấm dứt tự nguyện sau một thời gian, ví dụ một trong hai đồng bằng thoát sau khi một số lượng nhất định lặp đi lặp lại (nếu có) hoặc sử dụng bộ hẹn giờ hết thời gian với trình xử lý, hãy gửi SIGTERM/SIGKILL
  • nếu kết thúc dịch vụ tự nguyện không khả thi/thực tiễn bạn có thể có một tập lệnh cron nhỏ giết chết quy trình dịch vụ.
16

tôi thấy một giải pháp here dường như tao nhã, nếu một chút vòng xoay. Ý tưởng chính là tạo một dịch vụ một lần được kích hoạt bởi bộ hẹn giờ khởi động lại dịch vụ khác.

Đối với bộ đếm thời gian:

[Unit] 
Description=Do something daily 

[Timer] 
OnCalendar=daily 
Persistent=true 

[Install] 
WantedBy=timer.target 

Đối với dịch vụ one-shot:

[Unit] 
Description=Restart service 

[Service] 
Type=oneshot 
ExecStart=/usr/bin/systemctl try-restart my_program.service 

Đối với dịch vụ one-shot trên Ubuntu 16.04 LTS:

[Unit] 
Description=Restart service 

[Service] 
Type=oneshot 
ExecStart=/bin/systemctl try-restart my_program.service 

Giải pháp này cho phép bạn tận dụng bộ tính giờ của systemd, bao gồm khả năng khởi động lại dịch vụ tại một thời điểm cụ thể trong ngày và không chỉ sau một số lượng thời gian đã trôi qua.

+3

I ' m bối rối về cách hẹn giờ hàng ngày gọi dịch vụ một lần ở đây? – svandragt

+2

Tôi không chắc liệu đây có phải là những gì bạn đang yêu cầu hay không, nhưng, tốt nhất là tôi hiểu nó, dịch vụ một lần có hẹn giờ liên kết với nó và công việc của dịch vụ một lần này là khởi động lại dịch vụ khác . Tôi tin rằng điều này được thực hiện bằng cách đặt tên cho dịch vụ và bộ hẹn giờ được kết hợp với cùng tên, tức là 'weeklyRestart.service' và' weeklyRestart.timer'. Khi tôi làm việc này, tôi đã đi qua một liên kết _lot_. Nhắn tin cho tôi và tôi có thể gửi cho bạn một kết nối kết xuất. – matmat

+3

@svandragt Đó chính là cách hoạt động của nó.Bộ hẹn giờ hệ thống phải có cùng tên với dịch vụ mà nó bắt đầu. –

Các vấn đề liên quan