Cách chạy lệnh sau khi nâng cấp apt-get


7

Gần đây tôi đã bắt gặp một checkrestartcông cụ tuyệt vời , đó là kiểm tra xem các tiến trình đang chạy có sử dụng phiên bản lỗi thời của thư viện được cập nhật gần đây hay không và sẽ cần khởi động lại để tải chúng với lib được cập nhật. Hiện tại tôi phải gọi checkrestartbằng tay mỗi khi tôi đã sử dụng apt-get upgradehoặc aptitude upgrade.

Có cách nào để gọi một lệnh như vậy tự động sau apt-gethoặc aptitudeđã nâng cấp một số gói? Điểm thưởng nếu giải pháp cũng hoạt động với unattended-upgrades.

Câu trả lời:


8

Sau khi tìm kiếm thêm, hóa ra điều tôi đã nghi ngờ: aptchính nó cung cấp một tập hợp các hook để gọi các lệnh tại một số sự kiện nhất định, được sử dụng bởi rất nhiều công cụ nhưng dường như hầu như không được ghi lại.

Gọi một công cụ như checkrestartsau khi nâng cấp gói khá đơn giản. Một người chỉ cần đặt dòng mã sau vào /etc/apt/apt.confhoặc một trong các tệp hiện có hoặc một tệp mới trong /etc/apt/apt.conf.d/:

DPkg::Post-Invoke-Success { '/usr/sbin/checkrestart';};

Điều này sẽ gọi checkrestartmỗi lần dpkgđược gọi bởi apt(và tất nhiên là bất kỳ công cụ nào khác dựa vào apt, chẳng hạn như aptitude) và kết thúc thành công.


4
Hãy nhớ rằng aptthường gọi dpkgnhiều lần mỗi lần nó được chạy.

4
Bạn đã tìm thấy ở DPkg::Post-Invoke-Successđâu? Trong mã nguồn, tôi chỉ có thể tìm thấy DPkg::Post-Invoke, APT::Update::Post-InvokeAPT::Update::Post-Invoke-Success.
Gilles 'SO- ngừng trở nên xấu xa'

4

Có một vài cách để làm điều này.

Sử dụng tập lệnh

Một giải pháp nhanh và bẩn sẽ là viết một tập lệnh được gọi apt-gethoặc aptitudelàm cho nó gọi chương trình thực tế như sau:

#!/bin/bash
# filename: apt-get

# '$@' is all of the arguments passed to the script
/usr/bin/apt-get-bin "$@"
# or /usr/bin/aptitude-bin "$@"

if [[ $1 == *upgrade* ]] ; then
    checkrestart
fi

Làm cho tập lệnh thực thi : chmod +x apt-get. Bạn cũng có thể muốn tạo tập lệnh sở hữu bởi root : chown root apt-get; chgrp root apt-get. Cẩn thận không đặt bit setuid trên tập lệnh của bạn, bởi vì nếu kẻ tấn công giành được đặc quyền ghi cho nó, chúng có thể nhanh chóng và dễ dàng sửa đổi nó để cung cấp cho chúng một vỏ gốc.

Phương pháp này tất nhiên sẽ yêu cầu bạn di chuyển nhị phân thực tế sang một vị trí khác và di chuyển tập lệnh shell của bạn đến một vị trí trong đường dẫn của bạn. Nơi thích hợp để đặt tập lệnh người dùng là /usr/local/bin. Tuy nhiên, trong tình huống này, bạn nên đặt tập lệnh của mình vào vị trí nhị phân thực tế trước khi bạn di chuyển tập lệnh để giữ mọi thứ ngăn nắp.

Thay thế nhị phân bằng một tập lệnh theo cách này khá xâm phạm và ảnh hưởng đến tất cả người dùng trên máy. Thay vào đó, bạn có thể gọi kịch bản của mình một cái gì đó giống như apt-get-crvà chỉ cần nhớ gọi kịch bản đó thay vì apt-get. Bạn cũng có thể viết một hàm shell.

Sử dụng chức năng Shell

Sử dụng hàm shell cho phép bạn giữ tên lệnh apt-getmà không phải di chuyển xung quanh nhị phân.

apt-get() {
    # 'command' makes sure this function doesn't call itself.
    # You could also use a direct path the binary as shown above.
    command apt-get "$@"

    if [[ $1 == *upgrade* ]] ; then
        checkrestart
    fi
}

Đặt chức năng này ở đâu đó trong cấu hình shell của bạn ( ~/.bashrc, ~/.zshrc, vv)

Phương pháp này thường ít xâm phạm hơn nhiều so với phương thức script. Ngoài ra, nó không yêu cầu di chuyển xung quanh các nhị phân, thường là điều mà chỉ người dùng root mới có thể làm được.

Mặt khác, phương thức hàm shell không phải lúc nào cũng dễ di chuyển giữa các shell và vốn không phù hợp với các giao diện đồ họa như các thanh trình khởi chạy theo cách mà phương thức script thực hiện (hầu như bạn luôn có thể coi tập lệnh như một tệp nhị phân thực thi. )


2
Bạn cần trích dẫn $@đúng, lập luận của bạn sẽ được đọc sai.
Chris Down

Như bạn đã giới thiệu nó trong phiên bản ban đầu của câu trả lời của bạn, đó là một cách giải quyết. Hy vọng của tôi là apt hoặc aptitude đã cung cấp một số cơ chế hoặc hook riêng để thực thi các lệnh như vậy. Tôi hy vọng bạn không lấy nó nếu tôi chờ đợi một vài ngày nếu có câu trả lời khác.
Benedikt Bauer
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.