Compare commits

..

1 Commits

Author SHA1 Message Date
MickLesk f16aec63f4 fix(clean-lxcs): run with sh and keep going when one container fails
Alpine containers without bash failed with 127, and a failed apt update or pct start ended the whole run (12 runs in three days). The cleanup now runs with sh, keeps the apt lists so a failed update does not leave none, and lists the failed containers at the end.
2026-11-08 16:35:53 +01:00
2 changed files with 21 additions and 24 deletions
+16 -8
View File
@@ -54,35 +54,35 @@ function run_lxc_clean() {
header_info
name=$(pct exec "$container" -- hostname)
pct exec "$container" -- bash -c '
pct exec "$container" -- sh -c '
BL="\033[36m"; GN="\033[1;92m"; CL="\033[m"
name=$(hostname)
if [ -e /etc/alpine-release ]; then
echo -e "${BL}[Info]${GN} Cleaning $name (Alpine)${CL}\n"
printf "%b\n\n" "${BL}[Info]${GN} Cleaning $name (Alpine)${CL}"
apk cache clean
find /var/log -type f -delete 2>/dev/null
find /tmp -mindepth 1 -delete 2>/dev/null
apk update
elif [ -e /etc/redhat-release ]; then
echo -e "${BL}[Info]${GN} Cleaning $name (CentOS)${CL}\n"
printf "%b\n\n" "${BL}[Info]${GN} Cleaning $name (CentOS)${CL}"
yum clean all
find /var/log -type f -delete 2>/dev/null
find /tmp -mindepth 1 -delete 2>/dev/null
yum update
yum upgrade -y
else
echo -e "${BL}[Info]${GN} Cleaning $name (Debian/Ubuntu)${CL}\n"
printf "%b\n\n" "${BL}[Info]${GN} Cleaning $name (Debian/Ubuntu)${CL}"
find /var/cache -type f -delete 2>/dev/null
find /var/log -type f -delete 2>/dev/null
find /tmp -mindepth 1 -delete 2>/dev/null
apt -y --purge autoremove
apt -y autoclean
rm -rf /var/lib/apt/lists/*
apt update
fi
'
}
failed_containers=()
for container in $(pct list | awk '{if(NR>1) print $1}'); do
excluded=0
for ex in $excluded_containers; do
@@ -112,17 +112,25 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do
if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then
echo -e "${BL}[Info]${GN} Starting${BL} $container ${CL} \n"
pct start "$container"
if ! pct start "$container"; then
failed_containers+=("$container (start)")
continue
fi
echo -e "${BL}[Info]${GN} Waiting For${BL} $container${CL}${GN} To Start ${CL} \n"
sleep 5
run_lxc_clean "$container"
run_lxc_clean "$container" || failed_containers+=("$container")
echo -e "${BL}[Info]${GN} Shutting down${BL} $container ${CL} \n"
pct shutdown "$container" &
elif [ "$status" == "status: running" ]; then
run_lxc_clean "$container"
run_lxc_clean "$container" || failed_containers+=("$container")
fi
done
wait
header_info
if [ "${#failed_containers[@]}" -gt 0 ]; then
echo -e "${RD}Cleaning failed in these containers:${CL}"
printf '%s\n' "${failed_containers[@]}"
exit 1
fi
echo -e "${GN} Finished, Selected Containers Cleaned. ${CL} \n"
+5 -16
View File
@@ -84,7 +84,6 @@ function update_container() {
}
containers_needing_reboot=()
failed_containers=()
header_info
for container in $(pct list | awk '{if(NR>1) print $1}'); do
if [[ " ${excluded_containers[@]} " =~ " $container " ]]; then
@@ -102,17 +101,14 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do
template=$(pct config $container | grep -q "template:" && echo "true" || echo "false")
if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then
echo -e "${BL}[Info]${GN} Starting${BL} $container ${CL} \n"
if ! pct start $container; then
failed_containers+=("$container (start)")
continue
fi
pct start $container
echo -e "${BL}[Info]${GN} Waiting For${BL} $container${CL}${GN} To Start ${CL} \n"
sleep 5
update_container $container || failed_containers+=("$container")
update_container $container
echo -e "${BL}[Info]${GN} Shutting down${BL} $container ${CL} \n"
pct shutdown $container &
elif [ "$status" == "status: running" ]; then
update_container $container || failed_containers+=("$container")
update_container $container
fi
if [ "$status" == "status: running" ]; then
if pct exec "$container" -- [ -e "/var/run/reboot-required" ]; then
@@ -123,20 +119,14 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do
# check if patchmon agent is present in container and run a report if found
if pct exec "$container" -- [ -e "/usr/local/bin/patchmon-agent" ]; then
echo -e "${BL}[Info]${GN} patchmon-agent found in ${BL} $container ${CL}, triggering report. \n"
pct exec "$container" -- "/usr/local/bin/patchmon-agent" "report" || echo -e "${YW}[Warn]${CL} patchmon-agent report failed in $container\n"
pct exec "$container" -- "/usr/local/bin/patchmon-agent" "report"
fi
fi
fi
done
wait
header_info
if [ "${#failed_containers[@]}" -gt 0 ]; then
echo -e "${RD}The update failed in these containers:${CL}"
printf '%s\n' "${failed_containers[@]}"
echo ""
else
echo -e "${GN}The process is complete, and the containers have been successfully updated.${CL}\n"
fi
echo -e "${GN}The process is complete, and the containers have been successfully updated.${CL}\n"
if [ "${#containers_needing_reboot[@]}" -gt 0 ]; then
echo -e "${RD}The following containers require a reboot:${CL}"
for container_name in "${containers_needing_reboot[@]}"; do
@@ -144,4 +134,3 @@ if [ "${#containers_needing_reboot[@]}" -gt 0 ]; then
done
fi
echo ""
[ "${#failed_containers[@]}" -eq 0 ] || exit 1