Câu hỏi Chạy một quy trình daemon từ khởi động


Tôi đang chạy ứng dụng của tôi trên một VPS dưới Ubuntu 12.04 LTS.

Và tôi có một vấn đề với một quy trình daemon cho một trong các ứng dụng của tôi. Quá trình này được gọi là "delay_job" (Nếu không quen thuộc - đây chỉ là trình xử lý tác vụ nền).

Vấn đề với quá trình này là đôi khi nó bị giết (tôi cho rằng đó là vì tôi có lượng RAM giới hạn trên máy chủ của tôi - chỉ 1GB).

Nhưng vấn đề chính với điều này là nó là không có khả năng khởi động lại sau khi một sự cố hoặc "giết" tín hiệu, không giống như "kỳ lân" (nó là một máy chủ ứng dụng Rails) quy trình, mà luôn luôn nhận được khởi động lại không có vấn đề gì xảy ra với họ.

Và có, đây là một thỏa thuận rất lớn, bởi vì rất nhiều tính năng ứng dụng đang sử dụng các tác vụ nền.

Cùng một câu chuyện xảy ra khi có các công việc bảo trì trên VPS (được khởi xướng bởi chủ sở hữu VPS) và sau khi khởi động lại quá trình "delay_job" không còn hiện diện trong hệ thống nữa.

Đây là lệnh mà tôi chạy mỗi lần khởi động nó: RAILS_ENV=production script/delayed_job start

Đó là một vấn đề nổi tiếng, nhưng giải pháp duy nhất tôi tìm thấy trên Internet là bài viết này: http://www.alexreisner.com/code/upstart đề xuất sử dụng tính năng "mới nổi" của Linux với tùy chọn "respawn" có khả năng khởi động lại quy trình nếu nó bị giết hoặc bị lỗi.

Mặc dù bài viết có chút lỗi thời, tôi phát hiện ra rằng Ubuntu 12.04 nên hỗ trợ tính năng này và tôi đã tạo một liên kết tượng trưng trong /etc/init thư mục (Tôi đã gọi nó là: delay_job.conf) vào tập tin "delay_job" mà tôi đặt vào một trong các thư mục ứng dụng của tôi (app_name / config, chính xác) - Tôi đã làm mọi thứ mà bài báo này nói.

Vấn đề của tôi là: khi tôi thử khởi động quá trình mới này (start delayed_job) trong bảng điều khiển tôi nhận được:

delayed_job start/running, process 6000

Nhưng trên thực tế - không có quá trình "delay_job" nào được tạo ra.

Và trạng thái (status delayed_job) của quá trình initctl vẫn là: delayed_job stop/waiting

Sau khi tôi thực thi kill -9 6000 tôi có -bash: kill: (6000) - No such process

Vì vậy, điều này có nghĩa là không có gì được thực hiện. Tôi đã thử chạy nhiều lần trong các điều kiện khác nhau - không có gì, không có kết quả. Đơn giản là không hoạt động.

Có điều gì tôi có thể cố gắng để làm cho nó hoạt động, hoặc nó chỉ là vô dụng?


4
2018-02-23 19:11


gốc




Các câu trả lời:


Có vẻ như âm thanh EXPECT của bạn không chính xác hoặc không ở đó. Upstart đang theo dõi sai pid. Xem sách hướng dẫn để biết cách sử dụng CHỜ ĐỢI. Lưu ý cảnh báo về tầm quan trọng của phần đó.

Lưu ý rằng nếu ứng dụng của bạn quá khắt khe (có nghĩa là nó forks nhiều hơn hai lần) cho Upstart để theo dõi pid của nó, bạn có thể có thể theo dõi nó cho mình. Ứng dụng có thể có cơ chế viết tệp pid hoặc bạn có thể chụp start-stop-daemon. Xem điều này trả lời cho một ví dụ, cụ thể là tệp pg_agent.conf.

Chỉnh sửa:

Lưu ý, nếu Upstart không thể theo dõi pid của ứng dụng, bạn sẽ không thể sử dụng RESPAWN stanza. Trong trường hợp này Upstart có thể không phù hợp với nhu cầu của bạn. Có lẽ một sản phẩm cạnh tranh như foreversẽ. Không biết.


4
2018-02-25 17:45



Ừ. Tôi không sử dụng chữ "mong đợi" nào cả. Cảm ơn! Tôi sẽ xem qua một chút! - Dmitri
Vâng, bây giờ là "bắt đầu" và "dừng" cả hai công việc, nhưng, quá trình 'delay_job' không khởi động (theo ps aux | grep "delay_job"). Tôi đã thử cả hai tùy chọn: fork và daemon - không hoạt động. - Dmitri
Cái gì thế nĩa đếm? - Brian.D.Myers
Tôi có nên đếm nó bằng strace không? Tôi nên làm gì nếu nó lớn hơn 2 (deamon)? - Dmitri
Có, đếm với strace. Xem câu cuối cùng của câu trả lời đã chỉnh sửa của tôi cho ý tưởng nếu đó là> 2. - Brian.D.Myers