Làm thế nào để giám sát và tự động khởi động lại một quá trình?


34

Tôi muốn có một quá trình sẽ được khởi động lại nếu nó gặp sự cố. Tôi googled một chút và thấy rằng một giải pháp dễ dàng là sử dụng daemontools .

Tôi không hiểu cách cấu hình nó.

  1. Cách dễ nhất để hoàn thành một chức năng như vậy là gì?
  2. Làm thế nào để cấu hình nó?

Câu trả lời:


29

Câu trả lời này áp dụng cho các phiên bản Ubuntu có Upstart (<= 14.10). Sử dụng một cách tiếp cận khác cho các phiên bản có Systemd (> = 15.04).

Có vẻ như bạn đang tìm kiếm một chức năng đã được cung cấp trong Ubuntu với Upstart . Các khổ respawnthơ trong cấu hình sẽ làm chính xác những gì bạn cần. Tôi sẽ đề nghị chống lại việc sử dụng một cách ít tiêu chuẩn hơn để đối phó với điều này.

Không có thêm thông tin chi tiết về quy trình bạn đang cố gắng quản lý với nó, thật khó để nói cấu hình sẽ như thế nào. Nó phụ thuộc vào việc nó rèn và đặt chính nó vào nền chẳng hạn. Tài liệu Upstart trên khổ respawnthơ sẽ cung cấp cho bạn thêm thông tin.

Thật không may, vẫn chưa thể chạy Công việc người dùng đúng cách: không thể khởi động để chạy công việc người dùng

Thí dụ

Giả sử chúng ta muốn duy trì ứng dụng Máy tính chạy, ngay cả khi ứng dụng bị giết bằng lửa (tín hiệu 9).

  1. Tạo một tập tin cấu hình trong /etc/init/calculator.conf (dựa trên bài viết này ):

    #!upstart
    description "Calculator"
    
    # Start job via the daemon control script. Replace "gert" with your username.
    exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator'
    
    # Restart the process if it dies with a signal
    # or exit code not given by the 'normal exit' stanza.
    respawn
    
    # Give up if restart occurs 10 times in 90 seconds.
    respawn limit 10 90
    
  2. Bắt đầu nó bằng cách chạy

    sudo start calculator
    
  3. Nó mở trên màn hình hiện tại của bạn ( :0) và tận hưởng sự tuyệt vời bằng cách thấy nó khởi động lại sau khi đóng nó.

    • Xác định ID tiến trình, ví dụ bằng cách thực hiện ps aux | grep calculator :

      gert  13695 0.2 0.4 349744 16460 ?   Sl   13:38   0:00 /usr/bin/gnome-calculator
      
    • Giết nó bằng lửa.

      sudo kill -9 13695
      
    • Xem nó xuất hiện trở lại:

      gert  16059 4.6 0.4 349736 16448 ?   Sl   13:40   0:00 /usr/bin/gnome-calculator
      

Lưu ý rằng điều này sẽ thanh lịch hơn với các kế hoạch cho các gói Ubuntu 13.04 với sự hỗ trợ Công việc Người dùng phù hợp.


Tôi nhận được công việc chưa biết khi tôi cố gắng để bắt đầu nó? bất kỳ ideea. tôi đã đặt tập tin vào / etc / init
opc0de

@ opc0de Tên của tệp servicename.confphải khớp với lệnh để bắt đầu start servicename. Tôi nghi ngờ bạn đã chọn một tên khác.
gertvdijk

Không, nó phù hợp nhưng tôi đã không làm theo ví dụ của bạn vì vậy tôi nghĩ rằng tôi có thể có một lỗi cú pháp.
opc0de

@ opc0de Vâng, hãy bắt đầu bằng cách giải thích thêm về những gì bạn đang cố gắng thực hiện trong câu hỏi: loại ứng dụng / quy trình nào và cách bạn chạy nó chẳng hạn, cũng như các chi tiết về nỗ lực hiện tại của bạn.
gertvdijk

Giải quyết với ví dụ của bạn sai lầm của tôi là tôi có thể đã có một lỗi trong quy chế điều hành. Cảm ơn bạn đã giúp đỡ!
opc0de

13

Một công cụ cực kỳ đơn giản có thể thực hiện hiệu ứng tương tự mà không cần cấu hình là immortal: https://immortal.run/

Đơn giản chỉ cần thực hiện lệnh như thế này:

immortal <cmd>

Nó sẽ chạy trong nền và tự động khởi động lại nếu nó thoát.

  • immortalctl: Xem trạng thái của các công việc đang chạy. Đây là mộtname cột sẽ được in ở đây, bạn có thể sử dụng cột này để chỉ công việc với các lệnh điều khiển khác.
  • immortalctl stop <name>: Dừng theo dõi công việc với tên đã cho (nó sẽ không được tự động khởi động lại, nhưng quy trình hiện tại sẽ tiếp tục thực hiện)
  • immortalctl -k <name>: Gửi SIGKILL cho quy trình hiện tại.
  • immortalctl exit <name>: Dừng theo dõi công việc với tên đã cho và xóa nó khỏi danh sách công việc.

1
Cảm ơn, điều này đã làm việc rất tốt cho trường hợp sử dụng của tôi trong 16.04. Đặt cái này trong túi của tôi các công cụ hữu ích.
Quentin Skousen

2
Thật vậy, điều này có vẻ nhẹ hơn so với khởi đầu / hồi sinh.
Sridhar Sarnobat

Có cách nào để làm cho nó hiển thị stdoutstderrở phía trước không?
David S.

Tôi không biết về một cái, vì nó thường được sử dụng để chạy một quá trình trong nền. Tuy nhiên, bạn có thể sử dụng immortalctl -l out.log <cmd> && tail -f out.logđể đạt được hiệu quả tương tự.
động cơ ngoại khóa

@DavidS. bạn có thể nhận được một bản ghi kết hợp hoặc có thiết bị xuất chuẩn và stderr bất
tử.run / post

1

Nếu bạn không cần chức năng xử lý nền / dịch vụ / nền và chỉ muốn thực hiện trong bảng điều khiển thì hãy tạo một tệp có tên autorestart.sh:

#!/bin/bash

while [ 1 ]; do
  some_command
done

Sau đó ./autorestart.shsẽ tự động khởi động lại some_commandnếu nó thoát hoặc gặp sự cố. CTRL-C phá vỡ vòng lặp và thoát khỏi chương trình một cách sạch sẽ.

Đã thử nghiệm trên Ubuntu 18.04.


0

Có một cách mà không có "Upstart". Từ khóa là "inittab" :-). Mặc dù đó là một tệp thường không được thay đổi từ mặc định, nhưng nó có thể được sử dụng để đạt được sự hồi sinh mong muốn trên các máy SYSV.


Tôi không hiểu tại sao ai đó DỰ ÁN giải pháp này. Nếu bạn không hiểu nó, chỉ cần google nó; Thật vô nghĩa khi cắt và dán ở đây các trang của initttab, bạn có thể tự đọc chúng trên hệ thống của mình! chỉ cần gõ "man inittab" ...
cepal67

13
Câu trả lời chất lượng cao chi tiết hơn "sử dụng cái này, tự mình tìm ra" :)
Seth

0

ps-watcher là một công cụ theo dõi các tiến trình đang chạy và thực hiện một hành động trên các trường hợp được xác định. Hãy cài đặt nó:

apt-get install ps-watcher

Xem phần dưới cùng của Chạy HHVM với dự phòng cho PHP-FPM để biết chi tiết - điều này đã làm việc tốt với tôi.


Vì nó không dài lắm, xin vui lòng thêm một bản tóm tắt mã thay vì bài viết vì chỉ một phần rất ngắn áp dụng cho câu hỏi này.
derHugo

0

Các quy trình khởi động và hồi sinh được quản lý bởi "systemd" kể từ Ubuntu 15.04, một giới thiệu tốt có thể được tìm thấy ở đây

https://www.digitalocean.com/community/tutorials/systemd-essentials-usiness-with-service-units-and-the-journal

một ví dụ giúp bạn bắt đầu có sẵn trên

https://www.devdungeon.com/content/creating-systemd-service-files

Cách tiếp cận này thay thế những cái cũ hơn dựa trên / etc / inittab và mới bắt đầu.

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.