Cách tiêu chuẩn hoặc tốt nhất để duy trì quá trình sống bắt đầu bởi init.d


13

Tôi đang tìm kiếm một cách tiêu chuẩn hoặc thực hành tốt nhất để giữ một daemon bắt đầu bằng một init.dkịch bản shell.

Hoặc thậm chí tốt hơn, có cách nào để giữ cho nó sống trực tiếp từ /etc/init.d?

Cụ thể, tôi có một daemon được gọi là dtnd với và vòng lặp vô hạn tìm kiếm quá trình kết thúc bất ngờ, nếu có bất kỳ, daemon đánh thức chúng một lần nữa. Ngoài ra, tôi sử dụng công cụ start-stop-daemon để cho phép các điều kiện tiên quyết bằng cách chạy từ một người dùng hệ thống nhất định.

Tôi muốn chạy daemon dtnd này từ khi khởi động. Để đạt được hành vi này, tôi đã tạo một tập lệnh init.d "bọc" tệp dtnd bằng các lệnh start, stop và status.

Tôi có 2 câu hỏi mà tôi muốn giải quyết:

  1. Có cách nào để đạt được một số quy trình từ tập lệnh shell init.d. Là một cách thực hành tiêu chuẩn / tốt nhất?

  2. Bạn nên giữ một quá trình sống với vòng lặp vô hạn? Tôi đoán tốt hơn là sử dụng một số lệnh như respawnđể đạt được điều đó. Đúng?

Tôi biết về sự tồn tại của respawnlệnh. Tôi nghĩ đó là những gì tôi cần nhưng tôi không hiểu quy trình làm việc giữa /etc/init.d//etc/init. Ai giúp tôi với?

Lưu ý rằng tôi không có inittab không phải mới nổi (tôi chỉ được phép sử dụng /etc/init, /etc/init.d, cronvà các công cụ hệ thống như start-stop-daemon. Ý tôi là, chỉ những công cụ mặc định)

Cảm ơn bạn rất nhiều vì thời gian của bạn!


Câu trả lời:


13

Debian cuối cùng sẽ có systemd, vì vậy đây là cách để làm điều đó trên hệ thống Linux sử dụng systemd (và nhiều người đã làm như vậy; bạn có thể xem xét chuyển đổi các bản phân phối).

Systemd có thể tự động giữ dịch vụ sống cho bạn; không có công cụ khác được yêu cầu. Chỉ cần đảm bảo rằng nó Restart=alwaysđược đặt trong [Service]phần của tệp dịch vụ .

# vi /etc/systemd/system/dtnd.service

[Service]
Restart=always
#...everything else...

Một số tùy chọn khác cũng có sẵn, cho các kịch bản phức tạp hơn.


2
Trong khi tương lai cho thấy các tùy chọn linh hoạt hơn, điều này có quan tâm đến môi trường / điều kiện hiện tại không? Cài đặt một công cụ dường như là con đường ít kháng chiến nhất so với thay đổi / nâng cấp phân phối xe nâng.
ewwhite

@ewwhite Nó phụ thuộc. Debian có systemd kể từ khò khè, nhưng nó không phải là init mặc định. Nó nên được mặc định từ jessie. Và vì người dùng của chúng tôi đã chấp nhận câu trả lời, tôi cho rằng anh ta đã sử dụng systemd vì một lý do khác (hoặc có quyền cài đặt nó).
Michael Hampton

systemddường như loại bỏ init.dkịch bản và căn cứ vào*.service
yurenchen

2
Thay vì chỉnh sửa trực tiếp, hãy sử dụng an toàn hơn systemctl edit myservice, sau đó systemctl daemon-reloadkhởi động lại myservice.
Pablo A

@PabloBianchi Tạo ghi đè là tốt nếu bạn ghi đè lên đơn vị dịch vụ hiện có. Nếu bạn đang tạo một đơn vị từ đầu, như OP đã làm, thì thật vô nghĩa.
Michael Hampton

3

Bạn có thể thêm nó vào /etc/inittabvới respawn:

d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2

Đó là một bản hack bẩn, nhưng trước đây tôi đã sử dụng nó thành công trên các hệ thống sysv-init cũ.


Nhưng đừng để daemon sử dụng calidsid () và fork () để chạy trong nền?
symcbean

Cảm ơn bạn! Như bạn nói đó là một bản hack bẩn nhưng nó hoạt động. Dù sao tôi thích sử dụng systemd. Bây giờ tôi biết về sự tồn tại của nó.
Adrian Antunez

Điều này không hoạt động trên RHEL6. Tiện ích hô hấp dường như không có sẵn.
Djidiouf

2

Chà, đó là một trong những lý do chính, tại sao debian lại chuyển sang systemd.

sysvinit (/etc/init.d) không thể phát hiện, nếu một dịch vụ không hoạt động / không phản hồi. Điều này có nghĩa là bạn phải giám sát các dịch vụ này và leo thang nếu một dịch vụ sẽ không thực hiện công việc của mình nữa.

có lẽ điều dễ làm nhất là di chuyển sang một daemonhandler khác như systemd (mặc định trong RHEL7, sẽ được mặc định trong debian và ub Ubuntu lts tiếp theo), khởi động (mặc định trong RHEL6, Ubuntu 12.04 và 14.04), daemontools (như đã đề cập djb) hoặc một cái gì đó khác.

thực hiện công việc giữ cho một dịch vụ còn sống sẽ là PITA trong sysvinit.


1

Thực hành tốt nhất là đảm bảo rằng daemon của bạn KHÔNG DỪNG ở nơi đầu tiên.

Thất bại trong việc bạn có thể muốn xem qua daemontools của DJB


3
Tất nhiên, cách tốt nhất là đảm bảo rằng daemon của tôi không dừng lại. Nhưng có rất nhiều ứng dụng tuân theo cách tiếp cận if-I-stop-Wake-me như apache2, mysql, samba, pulseaudio ... Tôi đã tìm kiếm daemontools và có vẻ là một cách tiếp cận tốt. Thật không may, tôi không được phép cài đặt các công cụ bên ngoài. Tôi cần phải làm điều đó bằng cách sử dụng bash scripting hoặc start-stop-daemon và init.d config.
Adrian Antunez

1

Cách tiếp cận tiêu chuẩn đối với tôi là sử dụng tiện ích Monit cho việc này.

Tôi hoàn toàn không thể nói từ mô tả của bạn nếu bạn đã viết một cái gì đó như Monit và đang cố gắng đảm bảo rằng nó đang chạy hoặc nếu bạn cần một cái gì đó để xem daemon bạn đã tạo.


1
Xin chào, tôi phải đảm bảo rằng ứng dụng của mình đang chạy. Thật không may, tôi không được phép cài đặt các công cụ bên ngoài. Tôi cần phải làm điều đó bằng cách sử dụng bash scripting hoặc start-stop-daemon và init.d config.
Adrian Antunez

2
@ AdriánAntúnez Nếu bạn không được phép cài đặt các công cụ bạn cần để thực hiện công việc của mình, bạn nên khắc phục vấn đề đó càng sớm càng tốt.
Michael Hampton

@ AdriánAntúnez Bạn đã yêu cầu "tiêu chuẩn". Monit là khá nổi tiếng / được đánh giá cao. Bạn đã yêu cầu "tốt nhất" ... Hạn chế của bạn là một vấn đề chính trị. Tại sao bạn không được phép cài đặt phần mềm?
ewwhite

1
Nó không phải là một công cụ hoặc sự phụ thuộc không cần thiết nếu nó làm những gì bạn muốn nó làm .
ewwhite

1
@ewwhite Xin lỗi, ý tôi là tránh sự phụ thuộc của các công cụ bên ngoài.
Adrian Antunez
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.