Ngoài lỗi cú pháp đã được chỉ ra, đây là một cách tệ hại để đảm bảo rằng quy trình vẫn còn hoạt động.
Trước tiên, bạn nên tìm hiểu lý do tại sao chương trình của bạn sắp chết; tập lệnh này không sửa lỗi, nó cố gắng ẩn một tập lệnh.
Thứ hai, nếu điều quan trọng là chương trình vẫn đang chạy, tại sao bạn mong đợi tập lệnh shell lỗi (ít nhất một lần) sẽ thực hiện công việc? Sử dụng một hệ thống cơ sở được thiết kế đặc biệt để khởi động lại quá trình máy chủ. Nếu bạn nói nền tảng nào bạn đang sử dụng và bản chất của quá trình máy chủ của bạn. Tôi có thể đưa ra lời khuyên cụ thể hơn.
thêm để đáp ứng với bình luận:
Chắc chắn, có những nhu cầu cấp bách kỹ thuật, nhưng như OP đã nêu trong OP, vẫn còn là một lỗi trong nỗ lực này tại một giải pháp:
Tôi biết tôi nên kiểm tra theo tên quá trình và không xử lý id, vì một quá trình khác có thể nhảy vào và lấy id.
Vì vậy, bây giờ bạn bị bỏ lại với tập lệnh theo dõi PID, không phải là quá trình "vú em".Mặc dù rất có thể là nhỏ, kịch bản như tình hình hiện nay có một cửa sổ thứ hai mười trong đó
- sự "giám sát" quá trình thất bại
- tôi bắt đầu lên tuần dài quá trình emacs của tôi mà lấy cùng PID
- kịch bản vú em tiếp tục trên blissfully không biết rằng phụ thuộc của nó đã thất bại
Kịch bản không chỉ đơn thuần là lỗi, nó không hợp lệ vì nó giả định rằng PID là định danh ổn định của một quá trình. Có nhiều cách để điều này có thể được xử lý tốt hơn ngay cả ở cấp độ hệ vỏ. Cách đơn giản nhất là không bao giờ tách thực thi perl
khỏi tập lệnh vì tập lệnh không làm gì khác ngoài việc xem tiến trình con. Ví dụ:
while true ; do
if perl program_name.pl ; then
echo "program_name terminated normally, restarting"
else
echo "oops program_name died again, restarting"
fi
done
Điều này không chỉ ngắn hơn và đơn giản hơn mà còn thực sự chặn cho điều kiện bạn thực sự quan tâm: trạng thái chạy của chương trình perl. Kịch bản gốc liên tục kiểm tra một dấu hiệu proxy xấu của tình trạng chạy trạng thái chạy (PID) và do đó có thể làm cho nó sai. Và, vì toàn bộ mục đích của kịch bản nữ này là để xử lý các lỗi lầm, sẽ rất tệ nếu nó bị lỗi bởi thiết kế.
Tuyệt vời, tôi vừa mới bắt đầu kịch bản lệnh shell ngày hôm nay và nó đã giúp tôi phát điên. Tôi sẽ có một vấn đề cú pháp đơn giản bất cứ ngày nào trên một cái gì đó điên rồ phức tạp mặc dù. Cảm ơn một lần nữa. PS: Bạn đã trả lời rất nhanh (tôi đã đăng, đi vào phòng tắm, và trở lại giải pháp TÌNH YÊU TUYỆT VỜI TUYỆT VỜI!) Tôi phải đợi để kiểm tra câu trả lời đúng, nhưng tôi sẽ làm trong một thời gian ngắn. – user387049
@ user387049: Câu trả lời của John Kugelman phù hợp với kiến thức vỏ của bạn. Tuy nhiên, kịch bản của bạn là một cách giám sát kém chương trình; [Câu trả lời của msw] (http://stackoverflow.com/questions/3304559/how-to-use-a-shell-script-to-supervise-a-faulty-program/3304634#3304634) giải thích lý do. Một giải pháp mạnh mẽ hơn nhiều sẽ là sử dụng một chương trình giám sát hiện có, chẳng hạn như những người được đề cập bởi [Jonas] (http://stackoverflow.com/questions/3304559/how-to-use-a-shell-script-to- giám sát-một-lỗi-chương trình/3306727 # 3306727). – Gilles