Tránh các tệp PID, crons hoặc bất cứ thứ gì khác cố gắng đánh giá các quá trình không phải là con của họ.
Có một lý do rất chính đáng tại sao trong UNIX, bạn CHỈ có thể đợi con bạn. Bất kỳ phương pháp nào (phân tích cú pháp ps, pgrep, lưu trữ một PID, ...) cố gắng làm việc xung quanh đó là thiếu sót và có lỗ hổng trong đó. Chỉ cần nói không .
Thay vào đó, bạn cần quá trình theo dõi quá trình của bạn để trở thành cha mẹ của quá trình. Điều đó có nghĩa là gì? Nó có nghĩa là chỉ có quá trình bắt đầu quá trình của bạn có thể chờ đợi nó kết thúc một cách đáng tin cậy. Trong bash, điều này là hoàn toàn tầm thường.
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
Đoạn mã bash trên chạy myservertrong một untilvòng lặp. Dòng đầu tiên bắt đầu myservervà chờ cho nó kết thúc. Khi nó kết thúc, untilkiểm tra trạng thái thoát của nó. Nếu trạng thái thoát là 0, nó có nghĩa là nó đã kết thúc một cách duyên dáng (có nghĩa là bạn đã yêu cầu nó tắt bằng cách nào đó và nó đã thực hiện thành công). Trong trường hợp đó, chúng tôi không muốn khởi động lại nó (chúng tôi chỉ yêu cầu tắt nó!). Nếu trạng thái thoát là không 0 , untilsẽ chạy phần thân vòng lặp, nó sẽ phát ra một thông báo lỗi trên STDERR và khởi động lại vòng lặp (quay lại dòng 1) sau 1 giây .
Tại sao chúng ta đợi một giây? Bởi vì nếu có gì đó không đúng với trình tự khởi động myservervà nó gặp sự cố ngay lập tức, bạn sẽ có một vòng lặp rất nặng nề liên tục khởi động lại và sụp đổ trên tay. Việc sleep 1lấy đi sự căng thẳng từ đó.
Bây giờ tất cả những gì bạn cần làm là bắt đầu tập lệnh bash này (không đồng bộ, có thể), và nó sẽ theo dõi myservervà khởi động lại nó khi cần thiết. Nếu bạn muốn khởi động màn hình khi khởi động (làm cho máy chủ "sống sót" khởi động lại), bạn có thể lên lịch cho nó trong cron của người dùng (1) theo @rebootquy tắc. Mở quy tắc định kỳ của bạn với crontab:
crontab -e
Sau đó thêm quy tắc để bắt đầu tập lệnh màn hình của bạn:
@reboot /usr/local/bin/myservermonitor
Cách khác; nhìn vào inittab (5) và / etc / inittab. Bạn có thể thêm một dòng trong đó để myserverbắt đầu ở một mức init nhất định và được tự động trả lời.
Biên tập.
Hãy để tôi thêm một số thông tin về lý do tại sao không sử dụng các tệp PID. Trong khi chúng rất phổ biến; họ cũng rất thiếu sót và không có lý do tại sao bạn không làm đúng cách.
Xem xét điều này:
Tái chế PID (giết quá trình sai):
/etc/init.d/foo start: bắt đầu foo, viết fooPID của/var/run/foo.pid
- Một lúc sau:
foochết bằng cách nào đó.
- Một lát sau: bất kỳ quá trình ngẫu nhiên nào bắt đầu (gọi nó
bar) đều có một PID ngẫu nhiên, hãy tưởng tượng nó đang sử foodụng PID cũ.
- Bạn nhận thấy
foođã biến mất: /etc/init.d/foo/restartđọc /var/run/foo.pid, kiểm tra xem liệu nó còn sống hay không, tìm thấy bar, nghĩ rằng nó foo, giết chết nó, bắt đầu một cái mới foo.
Các tập tin PID trở nên cũ kỹ. Bạn cần logic quá phức tạp (hoặc tôi nên nói là không tầm thường) để kiểm tra xem tệp PID có bị cũ hay không, và bất kỳ logic nào như vậy lại dễ bị tổn thương 1..
Điều gì xảy ra nếu bạn thậm chí không có quyền truy cập ghi hoặc đang ở trong môi trường chỉ đọc?
Đó là sự quá mức vô nghĩa; xem ví dụ đơn giản của tôi ở trên là như thế nào Không cần phải phức tạp điều đó, tất cả.
Xem thêm: Các tệp PID vẫn còn thiếu sót khi thực hiện 'đúng'?
Nhân tiện; thậm chí còn tệ hơn các tệp PID đang phân tích cú pháp ps! Đừng bao giờ làm điều này.
pslà rất không quan trọng. Trong khi bạn tìm thấy nó trên hầu hết mọi hệ thống UNIX; đối số của nó rất khác nhau nếu bạn muốn đầu ra không chuẩn. Và đầu ra tiêu chuẩn CHỈ dành cho tiêu dùng của con người, không phải cho phân tích cú pháp theo kịch bản!
- Phân tích cú pháp
psdẫn đến rất nhiều tích cực sai. Lấy ps aux | grep PIDví dụ, và bây giờ hãy tưởng tượng ai đó bắt đầu một quá trình với một số ở đâu đó như là đối số xảy ra giống như PID mà bạn nhìn chằm chằm vào daemon của mình! Hãy tưởng tượng hai người bắt đầu một phiên X và bạn tham gia vào X để giết bạn. Nó chỉ là tất cả các loại xấu.
Nếu bạn không muốn tự mình quản lý quy trình; có một số hệ thống hoàn toàn tốt ngoài kia sẽ đóng vai trò giám sát các quy trình của bạn. Nhìn vào runit , ví dụ.