Làm thế nào tôi có thể biết khi nào một công việc định kỳ bị giết hoặc nó bị sập?


7

Thông thường khi một cron job crash, nó sẽ để lại một số thông báo lỗi trong nhật ký.

Chúng tôi chạy shell script và một số chương trình java với cron job. Gần đây chúng tôi tìm thấy một số điều kỳ lạ từ nhật ký. Rõ ràng chương trình đã bị sập hoặc bị giết vì có khóa chương trình chúng tôi đặt khi chương trình được khởi chạy, không được phát hành. Chúng tôi đoán chương trình đã bị giết vì nhật ký của chương trình không hiển thị thông báo kết thúc.

Ai có thể giết công việc và làm thế nào tôi có thể nhận được thông báo qua email khi một công việc định kỳ đã chết?

EDIT: Tôi không muốn cách crontab nhận email vì nó chỉ đẩy mọi đầu ra tiêu chuẩn vào email. Trong trường hợp của tôi, có rất nhiều đầu ra hệ thống khác từ các chương trình khác nhau vì một số trong số chúng không sử dụng log4j hoặc chúng được lặp lại bởi shell script. Vì có nhiều người dùng trong hệ thống, chúng tôi không thể yêu cầu tất cả người dùng quản lý đầu ra tiêu chuẩn của chương trình của họ.

Câu trả lời:


6

Để gỡ lỗi này, bạn có thể đặt

set -e -u

ở đầu tập lệnh shell của bạn - sau đó kết thúc bằng trạng thái thoát lỗi khi một lệnh thất bại hoặc một biến không xác định được sử dụng.

Sau đó, bạn có thể gọi từ cron-job một tập lệnh bao bọc gọi tập lệnh chính như thế này

sh -x main_script.sh || echo Failed with exit status: $?

Với -xmỗi dòng được in ra trước khi nó được thực thi. Đầu ra được gửi bởi cron daemon cho bạn.

Bạn cũng có thể sử dụng tệp tạm thời khi đầu ra quá lớn:

sh -x main_script.sh > $TEMPFILE 2>&1
if [ $? -ne 0 ]; then echo Failed with exit status $? - see $TEMPFILE; fi

Trong trường hợp trạng thái thoát là > 128lệnh bị gián đoạn bởi tín hiệu - ví dụ: ai đó đã 'giết' nó, đã xảy ra lỗi phân đoạn hoặc có tình trạng hết bộ nhớ ( cách lấy tín hiệu từ trạng thái thoát ).


6

Kiểm tra nhật ký hệ thống của bạn. Nhật ký nào cần kiểm tra tùy thuộc vào cài đặt của bạn; trên Debian với thiết lập mặc định, bạn nhận được:

  • trong /var/log/auth.log, thông báo từ khi công việc định kỳ bắt đầu và kết thúc, bởi vì công việc liên quan đến phiên PAM;
  • trong /var/log/syslog, một thông báo rằng grandchild #32283 failed with exit status 1.
  • một thông báo bổ sung /var/log/kern.lognếu quá trình của bạn bị chấm dứt bởi kẻ giết người OOM.

Bạn sẽ nhận được email từ cron nếu công việc định kỳ của bạn tạo ra bất kỳ đầu ra nào trên đầu ra tiêu chuẩn hoặc lỗi tiêu chuẩn (trừ khi hệ thống gửi thư cục bộ của bạn không được thiết lập đúng cách). Bạn sẽ không nhận được thư nếu nó lặng lẽ trả lại trạng thái khác thường (bao gồm cả trường hợp bị giết bởi tín hiệu). Nếu bạn muốn có một thông báo, hãy sắp xếp một trình bao bọc vỏ gây ồn trong trường hợp có lỗi, vd

42 1 * * * /path/to/real/job || echo $?

Nếu bạn muốn đăng nhập thêm thông tin về các quy trình và cách chúng chết (và chúng được sinh ra như thế nào, nhưng ở đây bạn đã biết), hãy xem Có nhật ký của các chủ đề trong quá khứ hiện đang bị đóng không?


@sourcejedi Tôi không chắc là tôi hiểu bình luận của bạn. Nếu bạn tự hỏi khi nào bạn có thể không nhận được tin nhắn từ shell nếu chương trình từ công việc định kỳ bị giết, thì đây là hai trường hợp phổ biến: 1. Bản thân shell bị giết trước khi có thời gian in bất cứ điều gì. 2. Công việc định kỳ chỉ chạy một thực thi và shell thực thi nó, vì vậy không có shell để in bất cứ thứ gì nếu quy trình của thực thi bị giết.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đang nói rằng sự hiểu biết của tôi là đối với hệ vỏ tương thích sh, bạn sẽ không bao giờ cần || echo $?phải phát hiện sự cố / giết chết theo câu hỏi, chỉ để phát hiện các lối thoát không có tín hiệu im lặng nhưng không trả về EXIT_SUCCESS (0). Điều thứ hai là không bình thường, bởi vì chúng cũng sẽ không hiển thị nếu bạn đã chạy lệnh từ trình bao tương tác. (Có thể hữu ích để kiểm tra các chương trình java lạ hoặc một cái gì đó).
nguồnjedi

1
@sourcejedi Nếu bạn chỉ có /path/to/myprogramcông việc và shell thực hiện tối ưu hóa lệnh thực thi chung và chương trình sẽ chết vì tín hiệu, thì không có gì sẽ in bất kỳ thông báo nào. Dấu vết duy nhất của cái chết sẽ là thông báo từ cron chứa trạng thái thoát của chương trình.
Gilles 'SO- ngừng trở nên xấu xa'

đau đớn. Tôi đã thử nghiệm hiệu quả echo "sleep 10" | bash. Hóa ra điều này hành xử khác với cả hai bash -c 'sleep "10"'- đó là những gì tôi nên thử nghiệm - và ví dụ echo "sleep 10" | dash, điều mà tôi cũng nên thử nghiệm.
nguồnjedi
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.