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 myserver
trong một until
vòng lặp. Dòng đầu tiên bắt đầu myserver
và chờ cho nó kết thúc. Khi nó kết thúc, until
kiể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
, until
sẽ 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 myserver
và 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 1
lấ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 myserver
và 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 @reboot
quy 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 đó để myserver
bắ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 foo
PID của/var/run/foo.pid
- Một lúc sau:
foo
chế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ử foo
dụ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.
ps
là 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
ps
dẫn đến rất nhiều tích cực sai. Lấy ps aux | grep PID
ví 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ụ.