Sida 1 av 1
Köra bash script vid uppstart av system
Postat: 20 okt 2021, 19:31
av ApeviaX
Hej på er
Jag har labbet lite med att få till ett bash script som körs automatiskt vid uppstart av systemet.
Tanken är att scriptet ska kicka igång terminalen och per automatik köra:
Scriptet i sig kickas igång av en crontab uppgift.
Lyckades få till ett test script (efter lite googlande) som genom echo skickar in mitt sudo lösenord för att hela kedjan skall gå per automatik...
Inte optimalt, men det är mest på skoj i testmiljö just nu.
Hur som helst är det ett par punkter som inte lirar, dels lyckas jag inte få till det så att terminalen faktiskt visas ("gnome-terminal" i detta fall) och ibland hänger sig upgrade biten.
Jag har gjort det så att scriptet skickar ut en .txt fil med output från terminalen, men jag blir inte klok på varför det tar stopp.
(Har inte access till min testmiljö i fråga nu, så kan inte ladda upp bash filen för stunden)
Vore kul med input från någon som faktiskt (till skillnad från mig) vet hur bash scripting funkar. Ex. på lösning och ev. ändringar jag kanske bör betänka?
Med vänlig hälsning,
Nicke
Re: Köra bash script vid uppstart av system
Postat: 20 okt 2021, 19:52
av Osprey
Det handlar i princip om att något av rc-scripten i /etc, automatiskt ska köra en update/upgrade och i det läget finns du själv inte riktigt med, eftersom det i början inte är ett fleranvändarsystem.
Kika t.ex på:
https://www.cyberciti.biz/faq/how-to-se ... nux-18-04/...att det står 18.04 behöver inte nödvändigtvis innebära att något har ändrat sig...
Har inte provat själv, eftersom jag själv föredrar att välja när jag vill göra en uppdatering, istället för att booten ibland tar några minuter extra... Jag kör det hellre manuellt när jag ändå ska hämta lite kaffe...

[EDIT] Ska du lägga in det i "/etc/rc*" så blir det givetvis under "
/etc/rcS.d" då. Men tänk på att om du har något fel i scriptet, eller något som inte stämmer, så måste du veta hur man gör en recovery-boot och går ut i root-prompten och fixar till det, annars är allting "
muerto" som det heter på finare språk....
Re: Köra bash script vid uppstart av system
Postat: 20 okt 2021, 20:16
av ApeviaX
Osprey skrev:Det handlar i princip om att något av rc-scripten i /etc, automatiskt ska köra en update/upgrade och i det läget finns du själv inte riktigt med, eftersom det i början inte är ett fleranvändarsystem.
Kika t.ex på:
https://www.cyberciti.biz/faq/how-to-se ... nux-18-04/...att det står 18.04 behöver inte nödvändigtvis innebära att något har ändrat sig...
Har inte provat själv, eftersom jag själv föredrar att välja när jag vill göra en uppdatering, istället för att booten ibland tar några minuter extra... Jag kör det hellre manuellt när jag ändå ska hämta lite kaffe...

[EDIT] Ska du lägga in det i "/etc/rc*" så blir det givetvis under "
/etc/rcS.d" då. Men tänk på att om du har något fel i scriptet, eller något som inte stämmer, så måste du veta hur man gör en recovery-boot, går ut i root-prompten och fixar till det....
Hej
Var inte beredd på att få svar så snabbt
Ska kika på länken och fundera lite, är nog dock inte så bevandrad med recovery-boot som du nämner är jag rädd

Re: Köra bash script vid uppstart av system
Postat: 20 okt 2021, 20:24
av Osprey
Här på Ubuntu-se får du (nästan) alltid rätt snabba svar, men läs nu också det senaste tillägget jag gjorde i mitt svar ovanför...
Att få det att ske automatiskt är "systemgrejor" och egentligen inget konstigt. Men det är alltså inget som en "vanlig användare" kan göra, eftersom det är något som påverkar hela systemet och Linux/Unix i grund och botten är/kan vara ett fleranvändarsystem.
Men som sagt och jag har kört Linux i 25 år och Unix i ungefär 35 år. Det finns egentligen ingen vinst i att köra alla update och och upgrade automatiskt. Visst går det, men var ligger vinsten...??

Re: Köra bash script vid uppstart av system
Postat: 20 okt 2021, 20:39
av Osprey
ApeviaX skrev:Ska kika på länken och fundera lite, är nog dock inte så bevandrad med recovery-boot som du nämner är jag rädd

En recovery-boot är inte så konstig eller krånglig egentligen (Conversational boot heter det i VAX/VMS och OpenVMS)....
Men du bör kunna använda vi/vim som ofta är den enda editor som finns tillgänglig då (min favorit) och du bör veta tillräckligt för att kunna se vad det var som gick fel (/var/log etc.) och veta ungefär hur /etc fungerar...
Inget svårt egentligen och i motsats till "vissa" andra operativsystem, där man inte kan "dyka ned under ytan" och se var det gick fel....

Re: Köra bash script vid uppstart av system
Postat: 20 okt 2021, 20:50
av Osprey
Kan tillägga att av alla de företag jag jobbat på som kör Linux eller övriga derivat av Unix, dvs. t.ex Volvo, Ericsson, ABB, Scania, Electrolux, SKF, FMV, Cactus Rail etc. så är det inga som kör några automatiska uppdateringar...
Det viktiga är att allting är stabilt och säkert. Ubuntu är väldigt aktiva och snabba och uppdaterar hela tiden (en gång per halvår), Fedora är ungefär (i kamp med Ubuntu) cutting edge, men sedan är SuSE (SLED och SLES) och CentOS (~RHEL (
där även Fedora ingår)) väldigt återhållsamma med nya releaser, ja förutom Fedora då alltså....
Oj, oj. oj hängde det här ihop...??

Re: Köra bash script vid uppstart av system
Postat: 20 okt 2021, 21:46
av Osprey
ApeviaX skrev:Ska kika på länken och fundera lite, är nog dock inte så bevandrad med recovery-boot som du nämner är jag rädd

En recovery-boot är inte så konstig eller krånglig egentligen (Conversational boot heter det i VAX/VMS och OpenVMS)....
Men du bör kunna använda vi/vim som ofta är den enda editor som finns tillgänglig då (min favorit) och du bör veta tillräckligt för att kunna se vad det var som gick fel (/var/log etc.) och veta ungefär hur /etc fungerar...
Inget svårt egentligen i motsats till "vissa" andra operativsystem, där man inte kan "dyka ned under ytan" och se var det egentligen gick fel....

Re: Köra bash script vid uppstart av system
Postat: 21 okt 2021, 18:34
av ApeviaX
Spännande
Jag har inget egentligt syfte med detta mer än att lära mig.
Tänkte testa detta i en av mina VirtualBox installationer, mest för att labba och eftersom jag inte använder maskinen dagligen så finns nästan alltid något att hämta nästa gång jag kör igång den.
Tänkte då att det kunde vara lite kul att både lära mig att skriva ett enkelt script samt schemalägga det att köras helt automatiskt vid uppstart.
Ser dock gärna att terminalfönstret laddas upp så att man kan se all "action"
/Nicke
Re: Köra bash script vid uppstart av system
Postat: 21 okt 2021, 18:48
av ApeviaX
Jag har gjort detta i 2 steg då jag först inte hajade hur jag fick igång allt via ett enskilt script.
Script #1.
Detta script skapar en textfil som heter "datum.txt" i vilken den skriver ut dagens datum samt tid vid tillfället då kommandot körs i scriptet. Detta blir ett kvitto på att något funkar.
Sista delen i det scriptet pekar på script #2 för att kicka igång det.
Kod: Markera allt
#!/bin/bash
date >> datum.txt
x-terminal-emulator -e /home/apeviax/startup.sh
Script #2. Har till syfte att köra igång terminalen och utföra uppdatering samt uppgradering av paket. Till sist vill jag ha output från terminalen till en textfil ("uu".txt) men detta har nu slutat funka efter att ha lirat något sånär vid manuell test.
Kod: Markera allt
#Bash prints out system message in terminal window.
echo "System update will start in 2 seconds."
#Bash pauses the xcript for 2 seconds.
sleep 2
echo upass | sudo -S sudo apt update >> uu.txt
#Bash pauses the script for 2 seconds.
sleep 2
#Bash prints out system message in terminal window.
echo "System upgrade will start in 2 seconds."
sleep 2
echo upass | sudo -S sudo apt upgrade -y >> uu.txt
OBS! att detta alltså är de första bash script jag försökt mig på på egen hand, kan det säkerligen finnas en del att slipa på. Särskilt om man bortser från det faktum att just det jag försöker göra inte är det mest korrekta användningsområdet.
/Nicke
Re: Köra bash script vid uppstart av system
Postat: 21 okt 2021, 18:50
av ApeviaX
Dessa script ovan är alltså tänkt att köras vid uppstart av min testmaskin, mest på skoj men som sagt även för att lära mig.
Som det är nu rullar alltså script #1. på utan problem via crontab uppgift.
Script #2. lyser med sin frånvaro såvida jag inte kör igång allt manuellt via terminalen i ett uppstartat system.
Avändningsområdet för vad dessa script gör är kanske inte stor, men kunskapen om att schemalägga via crontab eller ev. systemd (?) borde vara bra att greppa på sikt?
/Nicke
Re: Köra bash script vid uppstart av system
Postat: 21 okt 2021, 19:24
av ApeviaX
Här ser vi output från date kommandot som körs i Script #1. Det funkar gång på gång, både direkt vid start av system men även vid manuell test av scriptet via terminalen.

- datum.txt.png (24.49 KiB) Visad 6474 gånger
Här ser vi själva testscriptet kickas igång manuellet via terminalen, det är alltså script #1 som kickas igång för att direkt (när terminalfönstret dyker upp) köra vidare med script #2.
Till sist har vi här output från script #2 som "bevis"/"logg" att det kördes. (Eftersom ingen output syns när scriptet i sig kör update & upgrade i terminalen (?!)...
Kod: Markera allt
Get:1 http://dl.google.com/linux/chrome/deb stable InRelease [1 811 B]
Get:2 http://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1 078 B]
Get:3 http://security.ubuntu.com/ubuntu impish-security InRelease [90,7 kB]
Get:4 http://security.ubuntu.com/ubuntu impish-security/main i386 Packages [1 728 B]
Get:5 http://security.ubuntu.com/ubuntu impish-security/main amd64 Packages [3 316 B]
Get:6 http://security.ubuntu.com/ubuntu impish-security/main Translation-en [2 760 B]
Get:7 http://security.ubuntu.com/ubuntu impish-security/universe i386 Packages [804 B]
Get:8 http://security.ubuntu.com/ubuntu impish-security/universe amd64 Packages [2 796 B]
Get:9 http://security.ubuntu.com/ubuntu impish-security/universe Translation-en [2 416 B]
Hit:10 http://se.archive.ubuntu.com/ubuntu impish InRelease
Get:11 http://se.archive.ubuntu.com/ubuntu impish-updates InRelease [90,7 kB]
Hit:12 http://se.archive.ubuntu.com/ubuntu impish-backports InRelease
Get:13 http://se.archive.ubuntu.com/ubuntu impish/main amd64 DEP-11 Metadata [460 kB]
Get:14 http://se.archive.ubuntu.com/ubuntu impish/main DEP-11 48x48 Icons [109 kB]
Get:15 http://se.archive.ubuntu.com/ubuntu impish/main DEP-11 64x64 Icons [160 kB]
Get:16 http://se.archive.ubuntu.com/ubuntu impish/universe amd64 DEP-11 Metadata [3 701 kB]
Get:17 http://se.archive.ubuntu.com/ubuntu impish/universe DEP-11 48x48 Icons [3 247 kB]
Get:18 http://se.archive.ubuntu.com/ubuntu impish/universe DEP-11 64x64 Icons [7 845 kB]
Get:19 http://se.archive.ubuntu.com/ubuntu impish/multiverse amd64 DEP-11 Metadata [46,7 kB]
Get:20 http://se.archive.ubuntu.com/ubuntu impish/multiverse DEP-11 48x48 Icons [31,3 kB]
Get:21 http://se.archive.ubuntu.com/ubuntu impish/multiverse DEP-11 64x64 Icons [198 kB]
Get:22 http://se.archive.ubuntu.com/ubuntu impish-updates/main amd64 Packages [17,8 kB]
Get:23 http://se.archive.ubuntu.com/ubuntu impish-updates/main i386 Packages [3 396 B]
Get:24 http://se.archive.ubuntu.com/ubuntu impish-updates/main Translation-en [6 972 B]
Fetched 16,0 MB in 8s (1 945 kB/s)
Reading package lists...
Building dependency tree...
Reading state information...
3 packages can be upgraded. Run 'apt list --upgradable' to see them.
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
The following packages will be upgraded:
caca-utils google-chrome-stable libcaca0
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
2 standard security updates
Need to get 89,3 MB of archives.
After this operation, 1 050 kB of additional disk space will be used.
Get:1 http://dl.google.com/linux/chrome/deb stable/main amd64 google-chrome-stable amd64 95.0.4638.54-1 [89,0 MB]
Get:2 http://security.ubuntu.com/ubuntu impish-security/main amd64 libcaca0 amd64 0.99.beta19-2.2ubuntu2.1 [224 kB]
Get:3 http://security.ubuntu.com/ubuntu impish-security/universe amd64 caca-utils amd64 0.99.beta19-2.2ubuntu2.1 [57,2 kB]
Fetched 89,3 MB in 9s (9 622 kB/s)
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 280330 files and directories currently installed.)
Preparing to unpack .../google-chrome-stable_95.0.4638.54-1_amd64.deb ...
Unpacking google-chrome-stable (95.0.4638.54-1) over (94.0.4606.81-1) ...
Preparing to unpack .../libcaca0_0.99.beta19-2.2ubuntu2.1_amd64.deb ...
Unpacking libcaca0:amd64 (0.99.beta19-2.2ubuntu2.1) over (0.99.beta19-2.2ubuntu2) ...
Preparing to unpack .../caca-utils_0.99.beta19-2.2ubuntu2.1_amd64.deb ...
Unpacking caca-utils (0.99.beta19-2.2ubuntu2.1) over (0.99.beta19-2.2ubuntu2) ...
Setting up google-chrome-stable (95.0.4638.54-1) ...
Setting up libcaca0:amd64 (0.99.beta19-2.2ubuntu2.1) ...
Setting up caca-utils (0.99.beta19-2.2ubuntu2.1) ...
Processing triggers for libc-bin (2.34-0ubuntu3) ...
Processing triggers for man-db (2.9.4-2) ...
Processing triggers for menu (2.1.47ubuntu4) ...
Processing triggers for mailcap (3.69ubuntu1) ...
Processing triggers for bamfdaemon (0.5.5+21.10.20210710-0ubuntu1) ...
Rebuilding /usr/share/applications/bamf-2.index...
Processing triggers for desktop-file-utils (0.26-1ubuntu2) ...
Processing triggers for gnome-menus (3.36.0-1ubuntu1) ...
Hit:1 http://se.archive.ubuntu.com/ubuntu impish InRelease
Hit:2 http://dl.google.com/linux/chrome/deb stable InRelease
Hit:3 http://se.archive.ubuntu.com/ubuntu impish-updates InRelease
Hit:4 http://se.archive.ubuntu.com/ubuntu impish-backports InRelease
Hit:5 http://security.ubuntu.com/ubuntu impish-security InRelease
Reading package lists...
Re: Köra bash script vid uppstart av system
Postat: 21 okt 2021, 22:07
av Osprey
En viktig sak att tänka på om du kör script vid uppstart av systemet, är att i början finns inte speciellt mycket av det man normalt förväntar sig ska finnas. Det finns generellt sett 8 nivåer i Linux som som du även i efterhand kan nå via "init [0,1,2,3,4,5,6,S]".
Alla de här har sin motsvarighet i "/etc" alltså /etc/rc0.d, /etc/rc1.d, /etc/rc2.d, /etc/rc3.d, /etc/rc4.d, /etc/rc5.d, /etc/rc6.d och /etc/rcS.d, som alltså är de script och regler som används för att hantera respektive nivå.
Den första "/etc/rc0.d" är egentligen de script och kommandon som används när burken ska göra halt. Här kan man alltså lägga in sådant som man vill ska utföras varje gång systemet gör en "ordnad" halt/shutdown. Icke "ordnad" halt är, strömavbrott och sådant...
Resten är ungefär:
- init 1 : Single user mode or emergency mode means no network no multitasking is present in this mode only root has access in this runlevel
- init 2 : No network but multitasking support is present .
- init 3 : Network is present multitasking is present but with out GUI .
- init 4 : It is similar to runlevel 3; It is reserved for other purposes in research.
- init 5 : Network is present multitasking and GUI is present with sound etc.
- init 6 : This runlevel is defined to system restart.
- init S : Tells the init command to enter the maintenance mode. When the system enters maintenance mode from another run level, only the system console is used as the terminal.
Det är alltså främst i "runlevel 6/S" som det kan vara meningsfullt att lägga in något. Det du har som du eventuellt går att lägga in tidigare, har du ändå inte någon användning av förrän här och du riskerar att det "kvaddar" hela booten om något inte är perfekt...
Om du vill prova så kan du öppna en terminal och "hoppa mellan de olika nivåerna", med t.ex "init 3", "init 5", etc. Det här gör man t.ex vid vissa former av trixiga installationer, för att få ned systemet till lämplig nivå. Som exempel är installationer av X11 och annat, där du måste ta ned systemet till "runlevel 3" (inget GUI) för att det ska funka...
Att köra script via crontab är en helt annan och mycket enklare sak. Då säger du helt enkelt bara till vilket script som ska köras och när. Men tänk på att utskrifter och felhantering ställer lite andra krav än vanligt...

Re: Köra bash script vid uppstart av system
Postat: 23 okt 2021, 16:44
av Osprey
En speciell sak att tänka på är att både "echo" och "printf" skickar sina utskrifter "ut i binära rymden", eftersom det inte finns någon terminal knuten till processen.
Ibland funkar det med typ "echo foobar >> /dev/tty", men annars får man skriva till en fil istället, vanliga "echo" och "printf" funkar oftast inte....
Re: Köra bash script vid uppstart av system
Postat: 23 okt 2021, 17:25
av Osprey
Och för den delen:
...kan du utan vidare köra automatiskt, givetvis med "-y" som du anger. Men tänk på att du måste köra det i root:s crontab, eftersom du inte kan svara på "sudo" när det kör igång....
Re: Köra bash script vid uppstart av system
Postat: 23 okt 2021, 17:49
av Osprey
Ett problem till som kan uppstå är när det kommer en ny kärna eller så, för då
hjälper inte ens "-y".
Du kan kolla lite med det här scriptet som jag "hackat ihop"...
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
#needrestart -r l | grep "Your outdated processes"
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:"
echo "-Info about outdated processes:"
#echo "PROCESSES: $PROCESSES"
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 from "lsof" 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