status keluar pembaruan apt-get

8

Bagaimana memeriksa status apt-get update?

$ apt-get update ; echo "status is: $?"

Err http://security.debian.org stable/updates Release.gpg
Could not resolve 'security.debian.org'
Hit http://192.168.1.100 stable Release.gpg
Hit http://192.168.1.100 stable Release
Hit http://192.168.1.100 stable/main i386 Packages
Hit http://192.168.1.100 stable/contrib i386 Packages
Hit http://192.168.1.100 stable/non-free i386 Packages
Ign http://192.168.1.100 stable/contrib Translation-en
Ign http://192.168.1.100 stable/main Translation-en
Ign http://192.168.1.100 stable/non-free Translation-en
Reading package lists... Done
W: Failed to fetch http://security.debian.org/dists/stable/updates/Release.gpg  Could not resolve 'security.debian.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.

status is: 0

Di sini ada kesalahan dengan pengambilan pembaruan keamanan tetapi status keluar adalah 0

Tujuan saya adalah skrip untuk memeriksa apakah pembaruan apt-get berjalan dengan benar.

Pol Hallen
sumber

Jawaban:

6

Dalam contoh Anda apt-get updatetidak keluar dengan kesalahan, karena menganggap masalah sebagai peringatan, tidak seburuk yang fatal. Jika ada kesalahan yang sangat fatal, maka itu akan keluar dengan status tidak nol.

Salah satu cara untuk mengenali anomali adalah dengan memeriksa pola-pola ini di stderr:

  • Baris yang diawali dengan W:peringatan
  • Baris yang diawali dengan E:kesalahan

Anda bisa menggunakan sesuatu seperti ini untuk meniru kegagalan jika pola di atas cocok, atau kode keluar apt-get updateitu sendiri adalah nol:

if ! { sudo apt-get update 2>&1 || echo E: update failed; } | grep -q '^[WE]:'; then
    echo success
else
    echo failure
fi

Perhatikan !di if. Itu karena jalan grepkeluar dengan sukses jika polanya cocok, yaitu jika ada kesalahan. Ketika tidak ada kesalahan grepitu sendiri akan gagal. Jadi ifsyaratnya adalah untuk meniadakan kode keluar dari grep.

janos
sumber
1

Jika Anda ingin apt-get's out / err tidak dimakan (misalnya jika menulis ke file log), ini bisa menjadi alternatif yang lebih sederhana:

sudo apt-get update 2>&1 | tee /tmp/apt.err && ! grep -q '^[WE]' /tmp/apt.err

Akan lebih baik jika ini tidak meninggalkan file baru tergeletak di sekitar untuk menghapus nanti, tetapi jika kita, katakanlah, proses mengganti grep ke dalam keluaran tee tampaknya semakin sulit untuk mendapatkan kode keluar.

pengguna4122451
sumber
1

Saya dihadapkan dengan masalah yang sama, dan saya ingin mengusulkan solusi lain yang mengandalkan tee(seperti solusi @ user4122451), tetapi tidak membuat file sementara, dan juga gagal jika sudo apt-get updatemengembalikan kode keluar yang tidak nol tanpa mengeluarkan beberapa W:atau E:atau Err:string:

exec {fd}>&2 # copy stderr to some unused fd
bash -o pipefail -c "sudo apt-get update -y -q 2>&1 | tee /dev/fd/$fd | ( ! grep -q -e '^Err:' -e '^[WE]:' )"
result=$?
exec {fd}>&- # close file descriptor

Secara khusus, solusi ini bergantung pada set -o pipefailopsi bash (memastikan pipa mengembalikan nilai perintah paling kanan untuk keluar dengan status non-nol, jika tidak nol) dan menggunakan deskriptor file bernomor tambahan (lihat juga jawaban SO ini ).

Jika Anda tidak perlu membuat pipefailopsi lokal, Anda bisa menulis juga:

set -o pipefail
exec {fd}>&2 # copy stderr to some unused fd
sudo apt-get update -y -q 2>&1 | tee /dev/fd/$fd | ( ! grep -q -e '^Err:' -e '^[WE]:' )
result=$?
exec {fd}>&- # close file descriptor
ErikMD
sumber