Câu hỏi linux shell, giữ nhiệm vụ còn sống cho thời gian quy định


Tôi đang tìm kiếm một công cụ để giữ một nhiệm vụ còn sống (khởi động lại nếu cần thiết) trong một khoảng thời gian xác định (tính bằng giây), sau đó giết nó và dừng lại. Ví dụ: keep_for 3600 rsync foo bar:faz nên cố gắng đồng bộ hóa một thư mục (khởi động lại rsync trong trường hợp kết nối bị ngắt), nhưng dứt khoát giết rsync và ngừng respawning nó sau một giờ.

Tôi đã cố gắng viết một kịch bản lệnh shell cho điều đó, nhưng nó rất khó viết, với rất nhiều trường hợp cạnh (như quá trình con không bị giết, hoặc các vấn đề về thoát vỏ). Vậy ... có lẽ đã có một công cụ cho điều đó?


4
2018-05-07 20:49


gốc




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


Nếu hệ thống của bạn có Upstart, bạn có thể tạo sự kiện tệp cho tập lệnh / lệnh của bạn và điều này có thể làm những gì bạn muốn (nếu không phải bây giờ thì có thể trong một phiên bản tương lai sử dụng tính năng được lên kế hoạch).

Dưới đây là một vài thông tin từ events(5) trang người đàn ông:

  • Bắt đầu thủ công:

    bắt đầu vào <event>
      Mô tả về điều kiện nào để bắt đầu công việc này. Không có điều này   phần, công việc chỉ có thể được bắt đầu bằng tay với   initctl (8) lệnh.

  • Respawn:

    hồi sinh
      Điều này đặt cờ daemon, dịch vụ và respawn cho công việc.   Cờ hồi sinh có nghĩa là quá trình sẽ được khởi động lại khi   nó kết thúc

  • Giới hạn Respawn:

    giới hạn respawn [count [timeout]]
      Điều này cấu hình giới hạn respawn. Giới hạn Respawn chỉ áp dụng   nếu cờ respawn được đặt cho công việc; đặt giới hạn   không tự động đặt khả năng phản hồi. Nếu   quá trình được lặp lại nhiều hơn số lần đếm trong một   khoảng thời gian chờ giây, công việc sẽ bị dừng   tự động và không được khởi động lại. Giới hạn mặc định là 10   thời gian trong vòng 5 giây.

Xem Bắt đầu.


3
2018-05-07 21:27



Nếu tôi hiểu hướng dẫn một cách chính xác, đây là một tính năng được lên kế hoạch ... tôi cũng nghĩ rằng đối với một lệnh ad-hoc nó là hơi quá lớn :-) Tuy nhiên, cảm ơn bạn đã gợi ý. - liori


Tôi muốn tách các nhiệm vụ, giữ chúng trong cùng một kịch bản (tôi nghĩ về điều này như là một chương trình C, nhưng nó nên được làm như là một kịch bản).

Tôi sẽ bắt đầu với một bộ đếm thời gian subprocess nền để gửi một tín hiệu tại thời gian chờ. Bộ xử lý tín hiệu tắt mọi thứ một cách sạch sẽ và thoát ra.

Sau đó, bắt đầu một vòng lặp để đáp ứng lệnh mong muốn bất cứ khi nào nó thoát mà không có trạng thái thành công (0).

Cố gắng theo dõi cả thời gian chờ và lệnh trong một vòng lặp sẽ trở nên quá phức tạp.


0
2018-05-08 02:30



Nếu tôi muốn viết một kịch bản, tôi sẽ hỏi về stackoverflow. Ở đây tôi chỉ tìm kiếm một giải pháp đã sẵn sàng. - liori


Câu hỏi này được đặt ra về việc thực hiện. Tôi đề nghị bạn tái khung nó về những gì bạn đang cố gắng để đạt được mà có thể mang lại một giải pháp rõ ràng hơn (và thanh lịch).


-1
2018-05-08 06:15



Tôi đang tìm kiếm một công cụ mạnh mẽ chung để hồi sinh một quy trình trong một thời gian nhất định, và sau đó để ngăn chặn nó một cách mạnh mẽ sau một thời gian. Tải xuống / tải lên một tệp và phát radio internet bằng cách sử dụng mplayer là các trường hợp sử dụng thông thường của tôi, nhưng tôi thường có các tác vụ khác nhau phải được thực hiện trong một cửa sổ thời gian cụ thể. Cả hai rsyncvà mplayer dừng lại khi có ngắt kết nối, vì vậy tôi muốn chúng được khởi động lại. Đó là tất cả. - liori