Tôi có một máy chủ web nơi tôi chạy một số chương trình khởi động chậm như daemon. Đôi khi chúng cần khởi động lại nhanh (hoặc dừng) khi tôi biên dịch lại chúng hoặc chuyển sang cài đặt khác của chúng.Cho phép người dùng khác dừng/khởi động lại các bash daemon đơn giản - sử dụng tín hiệu hoặc điều gì?
Lấy cảm hứng từ http://mywiki.wooledge.org/ProcessManagement, tôi đang viết một kịch bản gọi daemonise.sh
trông giống như
#!/bin/sh
while :; do
./myprogram lotsadata.xml
echo "Restarting server..." 1>&2
done
để giữ một "daemon" chạy. Kể từ khi tôi đôi khi cần để ngăn chặn nó, hoặc chỉ khởi động lại nó, tôi chạy kịch bản mà trong một phiên màn hình, như:
$ ./daemonise.sh & DPID=$!
$ screen -d
Sau đó, có lẽ tôi biên dịch lại myprogram, cài đặt nó vào một con đường mới, bắt đầu những cái mới lên và muốn giết một tuổi:
$ screen -r
$ kill $DPID
$ screen -d
này hoạt động tốt khi tôi là người duy trì mà thôi, nhưng bây giờ tôi muốn cho người khác dừng/khởi động lại chương trình, bất kể ai bắt đầu nó. Và để làm cho mọi thứ trở nên phức tạp hơn, tập lệnh daemonise.sh
trên thực tế bắt đầu khoảng 16 chương trình, khiến bạn khó có thể giết tất cả các chương trình nếu bạn không biết PID của chúng.
Cách thức "thực hành tốt nhất" cho phép người dùng khác dừng/khởi động lại trình tiện ích con là gì?
Tôi đã nghĩ về các phiên màn hình được chia sẻ, nhưng điều đó nghe có vẻ như bị hack và không an toàn. Giải pháp tốt nhất mà tôi đã đưa ra cho bây giờ là để bọc bắt đầu và giết chết trong một kịch bản mà bắt tín hiệu nhất định:
#!/bin/bash
DPID=
trap './daemonise.sh & DPID=$!' USR1
trap 'kill $DPID' USR2 EXIT
# Ensure trapper wrapper doesn't exit:
while :; do
sleep 10000 & wait $!
done
Bây giờ, nên người dùng khác cần phải ngăn chặn các daemon và tôi không thể làm điều đó , cô ấy chỉ cần biết pid của trình bao bọc và ví dụ: sudo kill -s USR2 $wrapperpid
. (Ngoài ra, điều này làm cho nó có thể chạy các daemon khi khởi động lại, và vẫn giết chúng một cách sạch sẽ.)
Có giải pháp nào tốt hơn không? Có vấn đề rõ ràng với giải pháp mà tôi không thấy?
(Sau khi đọc Bash Wiki Greg, tôi muốn tránh bất kỳ giải pháp liên quan đến pgrep hoặc PID-files ...)
+1 cho liên kết Wiki của Greg's Bash. Chúc may mắn! – shellter
tệp pid là quy ước tốt nhất – reconbot
@wizard là đúng. bạn sẽ không nhận được một câu trả lời đáng giá bởi vì bạn về cơ bản nói "tôi biết bánh xe tồn tại, nhưng tôi muốn phát minh ra của riêng tôi". –