Làm thế nào để viết kịch bản dừng tùy chỉnh runit


12

Tôi muốn có một tập lệnh "dừng" tùy chỉnh runit( runsv) để thực thi khi phải dừng / khởi động lại quá trình. Hiện tại nó chỉ đơn giản là giết quá trình, sau đó chạy tập lệnh "kết thúc". Nhưng trong trường hợp của tôi, quy trình của tôi sinh ra các quy trình con một cách linh hoạt, vì vậy thay vì đơn giản kill, tôi cần phải "killtree"loại bỏ chúng. Làm thế nào để làm điều đó?

Tôi biết nó nên được thực hiện thông qua các controltùy chọn của runit nhưng từ việc đọc các tài liệu thì nó không thực sự rõ ràng đối với tôi cách đặt tên tập lệnh dừng :(

http://smarden.org/runit/runsv.8.html


Dịch vụ của bạn (không phải là kịch bản mà là chương trình) nghe có vẻ sai, nó sẽ gặt hái / dọn dẹp sau khi có con. Chỉ tò mò, nó là gì?
Avery Payne

Câu trả lời:


13

Từ các tài liệu

Đối với mỗi ký tự điều khiển c được gửi đến ống điều khiển, trước tiên, hãy kiểm tra xem dịch vụ / control / c có tồn tại không và có thể thực thi được không. Nếu vậy, nó bắt đầu dịch vụ / control / c và đợi cho nó kết thúc, trước khi diễn giải lệnh. Nếu chương trình thoát với mã trả về 0, runv sẽ không gửi dịch vụ tín hiệu tương ứng. Lệnh o luôn được coi là lệnh u. Trên lệnh d dịch vụ / control / t đầu tiên được chọn, và sau đó dịch vụ / control / d. Trên lệnh x dịch vụ đầu tiên / control / t được chọn, và sau đó dịch vụ / control / x. Việc kiểm soát dịch vụ đăng nhập tùy chọn có thể được tùy chỉnh.

Điều đó có nghĩa là bạn cần tạo một service_name/control/X, X là một tệp thực thi sẽ chạy khi bạn gửi svlệnh liên quan đến dịch vụ, như dlệnh (xuống). Nếu tập lệnh của bạn thoát với trạng thái 0, nó sẽ không cố gắng tự xuống dịch vụ.

Về cơ bản, bạn cần một tập lệnh thực thi trên /etc/sv/<service>/control/dđó sẽ làm bất cứ điều gì bạn muốn và giết dịch vụ, dọn sạch các thiết bị, v.v.


nó thực sự thú vị và đơn giản theo cách runv dir hoạt động.
Dzung Nguyễn

2

Câu trả lời đơn giản là đặt tên cho kịch bản dọn dẹp của bạn là "dịch vụ / kết thúc". Kịch bản này được thực thi khi "dịch vụ / chạy" thoát.

Ngoài ra còn có một giao diện "dịch vụ / điều khiển / ctrl_char. Nó cho phép bạn thực hiện các hành động khác nhau tùy thuộc vào lệnh bạn gửi đến ranv.


1
dịch vụ / kết thúc chạy sau khi HẠN LIÊN được gửi đến dịch vụ đang chạy. Nó giống như dịch vụ thanh toán bù trừ sau khi giết.
MaximKostrikin

2

Tôi đã phải tự giải quyết vấn đề này cho docker. Tôi đã có máy chủ uwsgi đang chạy và nó đã được gửi tín hiệu sai bởi docker (TERM thay vì INT) khi dừng container.

Ý tưởng của các tệp control / x là phản ứng với tín hiệu nhận được. Trong trường hợp của tôi, tôi sẽ đặt một ttệp cho tín hiệu kết thúc vào kiểm soát, vì đó là tệp dành riêng cho tín hiệu hạn. Kịch bản nên được thực thi.

#!/bin/bash
kill -INT `cat /tmp/project-master.pid`

Kịch bản gửi tín hiệu int đến tiến trình uwsgi, đó là điều tôi muốn.

Nếu tập lệnh điều khiển thoát mà không có lỗi (mã trả về 0), tín hiệu gốc sẽ không được gửi đến quá trình.

Vì vậy, trong trường hợp của tôi, tôi đã có thể nhận được tín hiệu hạn và gửi tín hiệu int đến quy trình dịch vụ thay thế.

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.