Có đầu ra email cron đến MAILTO dựa trên trạng thái thoát


11

Tôi có một công việc định kỳ chạy lệnh php như thế này:

php /path/to/script.php > dev/null

Điều này sẽ chỉ gửi đầu ra STDERR đến địa chỉ MAILTO. Từ những gì tôi thu thập được, tập lệnh php không xuất ra bất kỳ thông tin STDERR nào ngay cả khi trạng thái thoát của nó là 1.

Làm cách nào tôi có thể nhận được đầu ra của lệnh php (STDOUT) và chỉ gửi nó đến MAILTO nếu trạng thái thoát là khác không?

Câu trả lời:


12
php /path/to/script.php > logfile || cat logfile; rm logfile

mà bỏ đầu ra tiêu chuẩn vào logfilevà chỉ xuất nó nếu tập lệnh thất bại (thoát ra khác không).

Lưu ý: nếu tập lệnh của bạn cũng có thể xuất ra stderrthì bạn nên chuyển hướng stderrđến stdout. Nếu không, bất cứ điều gì được in stderrsẽ khiến cron gửi email ngay cả khi mã thoát là 0:

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile

Điều này cũng sẽ khởi động cho bất cứ điều gì xuất hiện trong stderr, điều này không nhất thiết có nghĩa là có lỗi (ví dụ: đầu ra gỡ lỗi).
hoffmanc

3

Bạn đã xem xét mãn tính từ moreutils . Tôi nghĩ rằng nó làm chính xác những gì bạn muốn:

mãn tính chạy một lệnh và sắp xếp cho lỗi tiêu chuẩn của nó và lỗi tiêu chuẩn chỉ được hiển thị nếu lệnh không thành công (thoát không khác hoặc gặp sự cố). Nếu lệnh thành công, mọi đầu ra không liên quan sẽ bị ẩn.

Trong các xác nhận gần đây, có một -ecông tắc để hiển thị toàn bộ đầu ra nếu có bất cứ điều gì đã được ghi vào thiết bị lỗi chuẩn.


2

Vì đầu ra được tạo trước khi biết trạng thái thoát, bạn sẽ phải lưu nó ở đâu đó.

Một khả năng là lưu trữ nó trong một biến shell:

output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
  printf "%s\n" "$output"
fi

Điều này không hoàn toàn bảo toàn đầu ra của tập lệnh (nó loại bỏ các dòng trống ở cuối), nhưng điều đó ổn đối với trường hợp sử dụng này. Nếu bạn muốn giữ lại các dòng trống:

output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
  printf "%s" "${output%a}"
fi

Nếu có khả năng có nhiều đầu ra, bạn có thể muốn lưu trữ nó trong một tệp tạm thời:

output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
  echo "script.php failed (status $ret), see the output in $output_file"
fi
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.