こちらのスクリプトを修正しました。(正確にはChatGPTに修正してもらいました)
修正版スクリプト
#!/bin/bash
# インストールされているパッケージの一覧を取得して別ファイルに出力します。
now=$(date +%Y%m%d)
dpkg-query -W > installed_packages_$now.txt
# aptitude updateを行います。
aptitude update
# updateの結果:
if aptitude search '~U' | grep -q '^i'; then
# 対象パッケージ,変更前バージョン,変更後のバージョン を記入した日付付きのファイルを作成。
now=$(date +%Y%m%d)
upgraded_packages=$(mktemp)
# パッケージのキャッシュをクリアした上でパッケージアップグレードを実施。
aptitude clean
aptitude -y full-upgrade | tee $upgraded_packages >/dev/null
# パッケージ一覧からの差分を別ファイルで作成。(実行日の日付を付与)
new_packages=$(mktemp)
dpkg-query -W > $new_packages
diff -u installed_packages_$now.txt $new_packages > package_diff_$now.txt
# 新しいパッケージ名を取得
DIFF_FILE="package_diff_$now.txt"
NEW_PACKAGES=$(grep -E "^\+[^+]" $DIFF_FILE | awk '{print $1}' | cut -c 2-)
# 変更されたパッケージの数と、新しいバージョンのパッケージ名のリストを表示
UPDATED_PACKAGES=$(echo "$NEW_PACKAGES" | wc -l)
echo "$UPDATED_PACKAGES 件のパッケージに変更がありました。以下のパッケージが更新されました:"
echo "$NEW_PACKAGES"
# checkrestartを実行して結果を取得
now=$(date +%Y%m%d)
checkrestart_output=$(checkrestart)
# サービスを再起動する必要のあるプロセスを抽出してファイルに出力
restart_services=$(echo "$checkrestart_output" | awk '/^(These are the systemd services|These are the initd scripts)/{flag=1;next}/^$/{flag=0}flag' | awk '{print $NF}' | sort -u)
if [[ -n "$restart_services" ]]; then
# ファイル名に日付を追加
now=$(date +%Y%m%d)
filename="restart_services_$now.txt"
echo "以下のサービスを再起動してください:" >> "$filename"
echo "$checkrestart_output" | awk '/^(These are the systemd services|These are the initd scripts)/{flag=1;next}/^$/{flag=0}flag' | grep -v "restart$" >> "$filename"
echo "$checkrestart_output" | awk '/^(These are the systemd services|These are the initd scripts)/{flag=1;next}/^$/{flag=0}flag' | grep "restart$" >> "$filename"
echo "以下のサービスを再起動してください:"
echo "$checkrestart_output" | awk '/^(These are the systemd services|These are the initd scripts)/{flag=1;next}/^$/{flag=0}flag' | grep -v "restart$"
echo "$checkrestart_output" | awk '/^(These are the systemd services|These are the initd scripts)/{flag=1;next}/^$/{flag=0}flag' | grep "restart$"
else
echo "再起動するサービスはありません"
fi
fi
差分
+ # 新しいパッケージ名を取得
+ DIFF_FILE="package_diff_$now.txt"
+ NEW_PACKAGES=$(grep -E "^\+[^+]" $DIFF_FILE | awk '{print $1}' | cut -c 2-)
+
+ # 変更されたパッケージの数と、新しいバージョンのパッケージ名のリストを表示
+ UPDATED_PACKAGES=$(echo "$NEW_PACKAGES" | wc -l)
+ echo "$UPDATED_PACKAGES 件のパッケージに変更がありました。以下のパッケージが更新されました:"
+ echo "$NEW_PACKAGES"
これによって、アップグレードするパッケージを明確化させました。
次の展望
「どこまで自動化できるか」が課題となります。パッケージによっては設定ファイルを残すかどうかのウィザードが表示されるので、それに対する自動実行までいけたらと思います。