Çıkış durumuna göre MAILTO'ya cron e-posta çıktısı alın


11

Ben böyle bir php komutu çalışan bir cron iş var:

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

Bu, MAILTO adresine yalnızca STDERR çıktısı göndermelidir. Ne php script toplamak ne zaman çıkış durumu 1 olsa bile herhangi bir STDERR bilgi çıkışı değildir.

Nasıl php komutunun (STDOUT) çıktısını almak ve sadece çıkış durumu sıfır değilse MAILTO gönderebilirim?

Yanıtlar:


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

bu da standart çıktıyı boşaltır logfileve yalnızca komut dosyası başarısız olursa (sıfırdan çıkarsa) çıktı verir.

Not: betiğinizin çıktısı da alınabiliyorsa stderr, yeniden yönlendirmeniz stderrgerekir stdout. Aksi takdirde, yazdırılan her şey stderrçıkış kodu 0 olsa bile cron'un e-posta göndermesine neden olur:

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

Bu aynı zamanda stderr'de görünen herhangi bir şey için de ortaya çıkacaktır, bu da bir hata olduğu anlamına gelmez (örneğin, hata ayıklama çıktısı).
hoffmanc

3

Eğer kabul mü kronik gelen moreutils . Bence tam olarak istediğini yapıyor:

chronic bir komutu çalıştırır ve standart komutunun ve standart hatanın yalnızca komut başarısız olduğunda (sıfır dışında veya çöktüğünde) görüntülenmesini ayarlar. Komut başarılı olursa, harici çıktılar gizlenir.

Son sürümlerde, stderr'e bir şey yazıldıysa, -etam çıktıyı gösteren bir anahtar vardır.


2

Çıkış, çıkış durumu bilinmeden oluşturulduğundan, bir yerde saklamanız gerekir.

Bir olasılık onu bir kabuk değişkeninde saklamaktır:

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

Bu, komut dosyasının çıktısını tamamen korumaz (sondaki boş satırları kaldırır), ancak bu kullanım durumu için sorun yoktur. Sondaki boş satırları korumak istiyorsanız:

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

Potansiyel olarak çok fazla çıktı varsa, bunun yerine geçici bir dosyada saklamayı tercih edebilirsiniz:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.