最近良い人に会いました。checkrestart
実行中のプロセスが最近更新されたライブラリの古いバージョンを使用していることを確認し、更新されたライブラリにロードするために再起動が必要かどうかを確認するツールです。現時点では、orをcheckrestart
使用するたびに手動で呼び出す必要があります。apt-get upgrade
aptitude upgrade
apt-get
特定のパッケージをアップグレードした後にこれらのコマンドを自動的に呼び出す方法はありますか?aptitude
ソリューションが適用されると、ボーナスポイントが提供されますunattended-upgrades
。
答え1
もう少し検索した後、私はすでに疑っていたことを発見しました。apt
それは多くのツールで使用されていますが、ほとんど文書化されていないように見える特定のイベントに対してコマンドを呼び出すフックセットを独自に提供します。
checkrestart
パッケージのアップグレード後にツールを呼び出すのは非常に簡単です。次のコード行を/etc/apt/apt.conf
既存のファイルの1つまたは新しいファイルに入れます/etc/apt/apt.conf.d/
。
DPkg::Post-Invoke-Success { '/usr/sbin/checkrestart';};
checkrestart
dpkg
この関数は呼び出されるたびに呼び出されapt
(もちろん依存する他のツールもapt
含むaptitude
)、正常に完了します。
答え2
これを行う方法はいくつかあります。
スクリプトの使用
迅速で汚い解決策は、apt-get
orというスクリプトを作成し、aptitude
次のように実際のプログラムを呼び出すことです。
#!/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
スクリプトを実行可能にします。chmod +x apt-get
。ルートが所有するスクリプトを作成することもできますchown root apt-get; chgrp root apt-get
。スクリプトにsetuidビットを設定しないように注意してください。攻撃者がスクリプトへの書き込みアクセス権を取得すると、スクリプトをすばやく簡単に変更してルートシェルを取得できるためです。
もちろん、この方法を使用するには、実際のバイナリを別の場所に移動し、シェルスクリプトをパスのどこかに移動する必要があります。ユーザースクリプトを配置する正しい場所はです/usr/local/bin
。ただし、この場合、クリーンな状態を維持するには、バイナリを移動する前に実際に存在していた場所にスクリプトを配置する必要があります。
このようにバイナリをスクリプトに置き換えることはかなり邪魔になり、システムのすべてのユーザーに影響を与えます。あるいは、スクリプト名を次のように指定できますapt-get-cr
。代わりにスクリプトを呼び出すことを忘れないでくださいapt-get
。シェル関数を作成することもできます。
シェル関数の使用
apt-get
バイナリを移動せずにコマンド名を保持するには、シェル機能を使用します。
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
}
この機能をシェル構成(など)のどこかに配置し~/.bashrc
ます~/.zshrc
。
この方法は通常、スクリプト方法よりも邪魔にならない。また、通常、rootユーザーのみが可能なモバイルバイナリは必要ありません。
欠点は、シェル関数アプローチがシェル間で常に移植性に優れているわけではなく、本質的にスクリプトアプローチなどのグラフィカルインタフェース(ランチャーバーなど)ではうまく機能しないことです(ほとんどの場合、スクリプトを実行可能なバイナリファイルとして扱うすることができます)。 。