Memiliki keluaran email cron ke MAILTO berdasarkan status keluar

11

Saya memiliki tugas cron yang menjalankan perintah php seperti ini:

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

Ini harus mengirim hanya output STDERR ke alamat MAILTO. Dari apa yang saya kumpulkan skrip php tidak menghasilkan informasi STDERR bahkan ketika status keluarnya adalah 1.

Bagaimana saya bisa mendapatkan output dari perintah php (STDOUT) dan hanya mengirimkannya ke MAILTO jika status keluarnya bukan nol?

Dave
sumber

Jawaban:

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

yang membuang output standar menjadi logfiledan hanya menampilkannya jika skrip gagal (keluar tidak nol).

Catatan: jika skrip Anda mungkin juga di-output stderrmaka Anda harus mengarahkan ulang stderrke stdout. Kalau tidak, apa pun yang dicetak stderrakan menyebabkan cron mengirim email meskipun kode keluarnya 0:

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile
Kyle Jones
sumber
Ini juga akan menendang keluar untuk apa pun yang muncul di stderr, yang tidak berarti ada kesalahan (misalnya, hasil debug).
hoffmanc
3

Apakah Anda dianggap kronis dari moreutils . Saya pikir itu tepat seperti yang Anda inginkan:

kronis menjalankan perintah, dan mengatur keluar standar dan kesalahan standar hanya ditampilkan jika perintah gagal (keluar bukan nol atau crash). Jika perintah berhasil, output asing akan disembunyikan.

Dalam verifikasi baru-baru ini, ada -esaklar untuk juga menunjukkan hasil lengkap jika ada sesuatu yang ditulis ke stderr.

saraedum
sumber
2

Karena output dihasilkan sebelum status keluar diketahui, Anda harus menyimpannya di suatu tempat.

Satu kemungkinan adalah menyimpannya dalam variabel shell:

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

Ini tidak sepenuhnya mempertahankan output skrip (ini menghilangkan garis-garis kosong yang tertinggal), tapi itu tidak masalah untuk kasus penggunaan ini. Jika Anda ingin mempertahankan trailing baris kosong:

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

Jika ada potensi banyak output, Anda mungkin lebih suka menyimpannya dalam file sementara:

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
Gilles 'SANGAT berhenti menjadi jahat'
sumber