trạng thái thoát cập nhật apt-get


8

Làm thế nào để kiểm tra tình trạng của 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

Ở đây có lỗi khi tìm nạp các bản cập nhật bảo mật nhưng trạng thái thoát là 0

Mục tiêu của tôi là một kịch bản để kiểm tra xem bản cập nhật apt-get có chạy đúng không.

Câu trả lời:


6

Trong ví dụ của bạn apt-get updatekhông thoát với lỗi, bởi vì nó coi các vấn đề là cảnh báo, không nghiêm trọng như vậy. Nếu có một lỗi thực sự nghiêm trọng, thì nó sẽ thoát với trạng thái khác không.

Một cách để nhận ra sự bất thường là bằng cách kiểm tra các mẫu này trong stderr:

  • Dòng bắt đầu bằng W:cảnh báo
  • Các dòng bắt đầu bằng E:lỗi

Bạn có thể sử dụng một cái gì đó như thế này để mô phỏng một thất bại trong trường hợp các mẫu trên khớp với nhau hoặc mã thoát của apt-get updatechính nó là khác không:

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

Lưu ý !trong if. Đó là bởi vì greplối thoát thành công nếu mô hình được khớp, đó là nếu có lỗi. Khi không có lỗi, grepchính nó sẽ thất bại. Vì vậy, ifđiều kiện là để phủ định mã thoát của grep.


1

Nếu bạn muốn apt-get's out / err không bị ăn (ví dụ: nếu ghi vào tệp nhật ký), đây có thể là một cách thay thế đơn giản hơn:

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

Sẽ thật tuyệt nếu điều này không để lại một tệp mới nằm xung quanh để xóa sau đó, nhưng nếu chúng ta nói, quá trình thay thế grep vào đầu ra tee thì có vẻ khó lấy mã thoát hơn.


1

Tôi đã phải đối mặt với cùng một vấn đề và tôi muốn đề xuất một giải pháp khác dựa trên tee(như giải pháp của @ user4122451), nhưng không tạo ra một tệp tạm thời và cũng thất bại nếu sudo apt-get updatetrả về mã thoát không bằng 0 mà không xuất ra một số W:hoặc E:hoặc Err:chuỗi:

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

Cụ thể, giải pháp này phụ thuộc vào set -o pipefailtùy chọn bash (đảm bảo đường ống trả về giá trị của lệnh ngoài cùng bên phải để thoát với trạng thái khác không, nếu không bằng 0) và sử dụng một bộ mô tả tệp được đánh số bổ sung (xem thêm câu trả lời SO này ).

Nếu bạn không cần đặt pipefailtùy chọn cục bộ, bạn cũng có thể viết như sau:

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
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.