När är det dags att boota om...??

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

När är det dags att boota om...??

Inlägg av Osprey »

Det finns många åsikter om när det är dags att starta om datorn och enklast är det för de som stänger av den på kvällen för att sedan starta den på morgonen...

Jag är däremot till stor del "uppväxt" i server-världen och där handlar det om att en dator måste gå så länge som det bara är möjligt, innan man startar om den...

Jovisst, inom Linux är det ju många som gärna säger att "det bara är att låta den gå hur länge som helst, för Linux minneshantering (etc.) är så himla effektiv"...

Men nådå, eller nja, eller kanske, knappast eller näääeeee.....

Hemma kör man ju ofta en dator där man gärna uppgraderar för att åtminstone någotsånär ha moderna saker, men ute på företag (framförallt drifts- och produktions-maskiner), så står samma gamla saker och snurrar, år efter år. Just för att det är stabilt och riskerna är små....

Själv låter jag ofta burken gå i en månad eller två utan att starta om (ja ok, den "spinner ned" på natten), bara för att jag är så van vid att en dator ska inte stängas av i onödan....

Men om man då är osäker, eller om man själv ska kolla när man borde starta om, hur gör man då...??

Så jag "hackade ihop" ett lite enkelt script som man kan använda för att kontrollera det.

Jag har provat det i Ubuntu, Mint, Debian, OpenSUSE, SLED, SLES, RedHat, Fedora och CentOS och det funkar jättebra i alla förutom RedHat-gruppen där det lite omotiverat antyder att omstart måste göras, trots att det inte behövs. Dessutom ingår den här kontrollen numera i "dnf" (nya versionen av "yum"), men funkar alltså inte riktigt ändå (för mig). Jag ska kolla närmare på det....

Men i Debian-Ubuntu-Mint och Opensuse-SLED-SLES funkar det bra.... :)

Kom gärna med synpunkter!

Kod: Markera allt

#! /bin/bash
#
function krnl {
	NAME=$(uname -s)
	MACHINE=$(uname -m)
	RUNNING_KRNL=$(uname -r)
	NEWEST_KRNL=$(ls -l /boot/vmlinuz | awk '{ print $11 }' | sed 's/vmlinuz-//g')
	#echo
	echo "Running kernel is:   $(uname -rms)"
	if [[ $RUNNING_KRNL != $NEWEST_KRNL ]]; then
		echo -e "\033[1m\033[31m=>A newer kernel exists, consider rebooting !!!!!\033[0m"
		echo "Newer version is:    $NAME $NEWEST_KRNL $MACHINE"
	fi
	echo
}
function chkProc {
	RETURN=0
	NPROC=$(ps -ef | tail -n +2 | wc -l)
	NPROCT=$(ps -efT | tail -n +2 | wc -l)
	MAX_PROC=$(cat /proc/sys/kernel/pid_max)
	if [[ -z $1 || $1 == "INIT" ]]; then
		MAX_PROC=$(cat /proc/sys/kernel/pid_max)
		MAX_UPROC=$(ulimit -u)
	fi
	let Z_count=0
	PIDS=$(ls -d /proc/[0-9]* 2> /dev/null | awk -F/ '{ print $3 }' 2>> /dev/null)
	for PID in $PIDS; do
		PSTATE=$(grep State: /proc/$PID/status  2>> /dev/null| awk '{ print $2 }')
		if [[ ! -z $PSTATE ]]; then
			if [[ $PSTATE == "X" ]]; then
				let X_count+=1
				RETURN=1
			elif [[ $PSTATE == "Z" ]]; then
				let Z_count+=1
				RETURN=1
			fi
		fi
	done
	echo "Number of processes:            $NPROC"         
	echo "Number of processes+threads:    $NPROCT"         
	echo "Max process limit:              $MAX_PROC"
	if [[ $X_count -ne 0 ]]; then
		echo "-Dead processes:                $X_count"
	fi
	if [[ $Z_count -ne 0 ]]; then
		echo "-Zombie processes:              $Z_count"
	fi
	if [[ $X_count -ne 0 || $Z_count -ne 0 ]]; then
		echo "*** Consider REBOOT ***"
	fi
	return $RETURN
}
if [[ $UID != 0 ]]; then
	echo
	echo "-This script must be run as root..."
	echo
	exit
fi
clear
echo
echo "=============================================================================="
echo "-Up in $(uptime -p)"
echo
echo "=============================================================================="
echo '-Checking "/var/run/reboot-recuired"'
if [[ -r /var/run/reboot-required ]]; then
	echo -en "\033[1m\033[31m"
	cat /var/run/reboot-required
	if [[ -r /var/run/reboot-required.pkgs ]]; then
		echo "-Packages that need reboot:"
		cat /var/run/reboot-required.pkgs | sort -u
	fi
	echo -en "\033[0m"
fi
echo
echo "=============================================================================="
echo "-Checking kernel"
krnl
echo "=============================================================================="
echo "-Checking processes"
chkProc
echo
DIST=$(source /etc/os-release; echo $ID | awk -F \- '{ print $1 }')
if [[ $DIST == "ubuntu" || $DIST == "linuxmint" || $DIST == "debian" ]]; then
	echo "=============================================================================="
	echo '-Running "needrestart"'
	if [[ ! -z $(which needrestart 2> /dev/null) ]]; then
		needrestart
	else
		echo 'needrestart is not installed - use "sudo apt install needrestart" to install it..."'
	fi
	echo
	echo "=============================================================================="
	echo '-Running "checkrestart"'
	echo '-Note that most messages about "fuse" can be ignored...'
	if [[ ! -z $(which checkrestart 2> /dev/null) ]]; then
		checkrestart -t
	else
		echo 'debian-goodies is not installed - use "sudo apt install debian-goodies" to install it...'
	fi
	echo
elif [[ $DIST == "opensuse" || $DIST == "sles" || $DIST == "sled" || $DIST == "sle" ]]; then
	echo "=============================================================================="
	if [[ -z $(which needs-restarting 2> /dev/null) ]]; then
		echo '-Running "zypper ps"'
		zypper ps
	else
		#echo 'yum-utils is not installed - use "sudo zypper install yum-utils" to install it...'
		echo '-Running "needs-restarting"'
		needs-restarting
	fi
	echo
elif [[ $DIST == "fedora" || $DIST == "centos" || $DIST == "redhat" || $DIST == "rhel" ]]; then
	echo "=============================================================================="
	if [[ ! -z $(which needs-restarting 2> /dev/null) ]]; then
		echo '-Running "dnf needs-restarting -r"'
		dnf needs-restarting -r
		echo
	else
		echo '-Running "needs-restarting -r"'
		needs-restarting -r
		echo
	fi
else
	echo "=============================================================================="
	echo "-$DIST is not supported yet, sorry!"
	echo
fi
Senast redigerad av 4 Osprey, redigerad totalt 23 gång.
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: När är det dags att boota om...??

Inlägg av Osprey »

Ny version med några små förbättringar.... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Gunnar Hjalmarsson
Inlägg: 3030
Blev medlem: 08 aug 2010, 13:49
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Göteborg

Re: När är det dags att boota om...??

Inlägg av Gunnar Hjalmarsson »

För trött att läsa kod just nu...

Kan du förklara på vanlig svenska vilka kriterier skriptet använder för att besvara frågan?
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: När är det dags att boota om...??

Inlägg av Osprey »

Gunnar Hjalmarsson skrev:Kan du förklara på vanlig svenska vilka kriterier skriptet använder för att besvara frågan?
Om man kör scriptet i Ubuntu, Mint etc. så gör det följande:
  1. Kontrollerar förekomsten av /var/run/reboot-required. I denna fil lägger systemet oftast ut information om en omstart är nödvändig.
    .
  2. Kontrollerar och visar antalet processer i systemet och hur många av dessa som är "döda" eller "zombies". Här får man själv göra en bedömning om ifall man vill starta om.
    .
  3. Kör "needrestart" som kontrollerar behovet av omstart. Detta program är fullt supportat av Ubuntu/Mint och ingår i standardprogramarkivet.
    .
  4. Kör "checkrestart" som gör en annan kontroll av behovet av omstart. Detta paket ingår i "debian-goodies", som i sin tur finns i standardprogramarkivet.
En automatisk funktion som man också får när man installerar "needrestart" är att behovet av omstart kontrolleras (med "needrestart") varje gång man kör "apt install" eller "apt-get install". Om så behövs så erbjuder den också möjligheten att under kontrollerade former starta om de demoner som eventuellt kör gammal utdaterad kod.

I SuSE (OpenSuSE, SLED & SLES) och i RedHat (RHEL, Fedora & CentOS) kör det liknande funktioner...
Senast redigerad av 1 Osprey, redigerad totalt 11 gånger.
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Gunnar Hjalmarsson
Inlägg: 3030
Blev medlem: 08 aug 2010, 13:49
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Göteborg

Re: När är det dags att boota om...??

Inlägg av Gunnar Hjalmarsson »

Tack, då förstår jag konceptet.

Frågade egentligen inte så mycket för egen del, då jag tenderar att starta om mycket ofta. Nyligen höll jag på och testade ändringar i ett paket, vilket innebar att jag några gånger gjorde 5-10 omstarter inom loppet av några minuter. ;)
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: När är det dags att boota om...??

Inlägg av Osprey »

Så här ser förresten en utskrift från det ut just nu på den här burken...
================================================
-Checking "/var/run/reboot-recuired"

================================================
-Checking processes
Number of processes: 234
Number of processes+threads: 745
Max process limit: 4194304

================================================
-Running "needrestart"
Scanning processes...
Scanning candidates...
Scanning processor microcode...
Scanning linux images...

Running kernel seems to be up-to-date.

The processor microcode seems to be up-to-date.

No services need to be restarted.

No containers need to be restarted.

User sessions running outdated binaries:
magnus @ user manager service: systemd[1515]

================================================
-Running "checkrestart"
-Note that most messages about "fuse" can be ignored...
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
lsof: WARNING: can't stat() fuse file system /run/user/1000/doc
Output information may be incomplete.
20 processes using old versions of upgraded files
Som synes behöver burken startas om och även "reboot-required" och processerna ser ok ut.... :)
Senast redigerad av 1 Osprey, redigerad totalt 23 gånger.
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: När är det dags att boota om...??

Inlägg av Osprey »

Ny förbättrad version inlagd. Den senaste versionen finns alltid i det ursprungliga inlägget (alltså högst upp) eftersom jag inte ser någon mening i att gamla versioner ska synas och att någon av misstag ska kunna ladda hem fel (gammal) version.... ;)

[EDIT] Versionerna för SuSE och RedHat inte fullt testade, eftersom jag kör Ubuntu (egentligen Mint) själv just nu. Har dock både SuSE (OpenSuSE) och RedHat (CentOS) installerat och ska testa där vid senare tillfälle.... :D
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: När är det dags att boota om...??

Inlägg av Osprey »

Ny version, som också kan köras av "vanliga användare" och som visar vad man kan eller bör starta om....

Kod: Markera allt

#! /bin/bash
#
function krnl {
	NAME=$(uname -s)
	MACHINE=$(uname -m)
	RUNNING_KRNL=$(uname -r)
	NEWEST_KRNL=$(ls -l /boot/vmlinuz | awk '{ print $11 }' | sed 's/vmlinuz-//g')
	#echo
	echo "Running kernel is:   $(uname -rms)"
	if [[ $RUNNING_KRNL != $NEWEST_KRNL ]]; then
		echo -e "\033[1m\033[31m=>A newer kernel exists, consider rebooting !!!!!\033[0m"
		#echo "Newer version is:    $NAME $NEWEST_KRNL $MACHINE"
		echo "Newer kernel is:     $NAME $NEWEST_KRNL $MACHINE"
	else
		echo "-Ok"
	fi
	echo
}
function chkProc {
	RETURN=0
	NPROC=$(ps -ef | tail -n +2 | wc -l)
	NPROCT=$(ps -efT | tail -n +2 | wc -l)
	MAX_PROC=$(cat /proc/sys/kernel/pid_max)
	if [[ -z $1 || $1 == "INIT" ]]; then
		MAX_PROC=$(cat /proc/sys/kernel/pid_max)
		MAX_UPROC=$(ulimit -u)
	fi
	let Z_count=0
	PIDS=$(ls -d /proc/[0-9]* 2> /dev/null | awk -F/ '{ print $3 }' 2>> /dev/null)
	for PID in $PIDS; do
		PSTATE=$(grep State: /proc/$PID/status  2>> /dev/null| awk '{ print $2 }')
		if [[ ! -z $PSTATE ]]; then
			if [[ $PSTATE == "X" ]]; then
				let X_count+=1
				RETURN=1
			elif [[ $PSTATE == "Z" ]]; then
				let Z_count+=1
				RETURN=1
			fi
		fi
	done
	echo "Number of processes:            $NPROC"         
	echo "Number of processes+threads:    $NPROCT"         
	echo "Max process limit:              $MAX_PROC"
	if [[ $X_count -ne 0 ]]; then
		echo "-Dead processes:                $X_count"
	fi
	if [[ $Z_count -ne 0 ]]; then
		echo "-Zombie processes:              $Z_count"
	fi
	if [[ $X_count -ne 0 || $Z_count -ne 0 ]]; then
		echo "*** Consider REBOOT ***"
	fi
	return $RETURN
}
if [[ -z $EUID ]]; then
	EFFUID=$(ps --no-headers -o euid --pid $$ | xargs)
else
	EFFUID=$EUID
fi
clear -x
echo
echo "=============================================================================="
echo "-Up in $(uptime -p)"
echo
echo "=============================================================================="
echo '-Checking "/var/run/reboot-recuired"'
if [[ -r /var/run/reboot-required ]]; then
	echo -en "\033[1m\033[31m"
	cat /var/run/reboot-required
	if [[ -r /var/run/reboot-required.pkgs ]]; then
		echo "-Packages that need reboot:"
		cat /var/run/reboot-required.pkgs | sort -u
	else
		echo "-No info about pkgs"
	fi
	echo -en "\033[0m"
else
	echo "-Ok"
fi
echo
echo "=============================================================================="
echo "-Checking kernel"
krnl
echo "=============================================================================="
echo "-Checking processes"
chkProc
echo
DIST=$(source /etc/os-release; echo $ID | awk -F \- '{ print $1 }')
if [[ $DIST == "ubuntu" || $DIST == "linuxmint" || $DIST == "debian" ]]; then
	echo "=============================================================================="
	echo '-Running "needrestart"'
	if [[ ! -z $(which needrestart 2> /dev/null) ]]; then
		needrestart -r l
		if [[ $EFFUID != "0" ]]; then
			PROCESSES=$(needrestart 2> /dev/null | tail -n +2 | tr -d -c '[:digit:] ' | xargs)
			if [[ ! -z $PROCESSES ]]; then
				echo "-Own processes that need restart:"
				ps -fp $PROCESSES
			fi
		fi
	else
		echo 'needrestart is not installed - use "sudo apt install needrestart" to install it..."'
	fi
	echo
	echo "=============================================================================="
	if [[ $EFFUID == "0" ]]; then
		echo '-Running "checkrestart"'
		echo '-Note that most messages about "fuse" can be ignored...'
		if [[ ! -z $(which checkrestart 2> /dev/null) ]]; then
			checkrestart -t
		else
			echo 'debian-goodies is not installed - use "sudo apt install debian-goodies" to install it...'
		fi
		echo
	else
		echo '-Can not run "checkrestart", as we are not root...'
		echo
	fi
elif [[ $DIST == "opensuse" || $DIST == "sles" || $DIST == "sled" || $DIST == "sle" ]]; then
	echo "=============================================================================="
	if [[ -z $(which needs-restarting 2> /dev/null) ]]; then
		echo '-Running "zypper ps"'
		zypper ps
	else
		#echo 'yum-utils is not installed - use "sudo zypper install yum-utils" to install it...'
		echo '-Running "needs-restarting"'
		needs-restarting
	fi
	echo
elif [[ $DIST == "fedora" || $DIST == "centos" || $DIST == "redhat" || $DIST == "rhel" ]]; then
	echo "=============================================================================="
	if [[ ! -z $(which needs-restarting 2> /dev/null) ]]; then
		echo '-Running "dnf needs-restarting -r"'
		dnf needs-restarting -r
		echo
	else
		echo '-Running "needs-restarting -r"'
		needs-restarting -r
		echo
	fi
else
	echo "=============================================================================="
	echo "-$DIST is not supported yet, sorry!"
	echo
fi
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Skriv svar

Återgå till "Terminalforum"