Bash processer
Denne artikel er en del af bash
Contents
bash og processer
Processer er de programmer der kører på maskinen og programmer du starter i bash. For eksempel startes herunder programmet df eller Disk Free som viser maskinens harddisk partitioner.
[root@mars ~]# <input>df -h</input>
Filesystem Size Used Avail Capacity Mounted on
/dev/da0s1a 1.9G 224M 1.5G 13% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/da1s1e 19G 9.1G 8.3G 52% /home
/dev/da0s1d 2.8G 638M 2.0G 24% /tmp
/dev/da0s1e 19G 9.3G 8.1G 53% /usr
/dev/da1s1d 4.7G 454M 3.9G 10% /var
/dev/da0s1f 29G 8.1M 27G 0% /var/cache1
/dev/da1s1f 29G 8.1M 27G 0% /var/cache2
devfs 1.0K 1.0K 0B 100% /var/named/dev
Hvilke processer kører på maskinen
De processer der kører på maskinen kan ses med ps process-status kommandoen. Med denne kommando kan man se hvilke processer man selv har startet samt alle andres processer. Selve maskinen har mange processer kørende. For eksempel services som er de serverprogrammer maskinen kører.
Fødslen af et process
Når der startes en ny process vil bash starte processen med tre åbne filhåndtag. Dette er den normale situation og sker hver gang der startes et program/process. Uanset om processen bruger dem eller ej.
Navn | filhåndtag # | Forklaring |
---|---|---|
STDIN (Standard input) | 0 | Standard indlæsning af data. Hentes som standard fra tastaturet |
STDOUT (Standard output) | 1 | Standard udlæsning af data. Sendes som standard til skærmen |
STDERR (Standard error) | 2 | Fejl beskeder fra processem. Sendes som standard til skærmen |
I eksemplet herunder startes programmet grep' af bash som en process med STDIN,STDOUT og STDERR. STDIN og STDERR anvendes ikke i eksemplet. men de er der.
[heth@mars ~]$ <input>grep heth /etc/passwd</input>
heth:*:1001:1001:Henrik Thomsen:/home/heth:/usr/local/bin/bash
I eksemplet herunder - hvor der ikke angives et filnavn - vil grep anvende STDIN til at hente data som tastet på tastaturer. Linier med hvidt skrives og linier med grønt skriver bash linier med blå skriver grep
[heth@mars ~]$ <input>grep bil</input>
<input>Jeg har en cykel</input>
<input>maden er billig</input>
<notice>maden er billig</notice>
<input>der er to piller i skabet</input>
<input>min bil skal til syn</input>
<notice>min bil skal til syn</notice>
<input>^C</input>
[heth@mars ~]$
Omdirigering af standard datastrømme
Tegn | Omdirigerer | Eksempel | Kommentar |
---|---|---|---|
> | STDOUT | grep Error /var/log/stor_logfil > /tmp/found_errors | Overskriver eventuelt eksisterende fil |
>> | STDOUT | grep Error /var/log/stor_logfil >> /tmp/found_errors | Appender dvs. tilføjer til eventuelt eksisterende fil |
2> | STDERR | backup /home 2> /tmp/backup_errors | Overskriver eventuelt eksisterende fil |
2>> | STDERR | backup /home 2>> /tmp/backup_errors | Appender dvs. tilføjer til eventuelt eksisterende fil |
< | STDIN | bc < /tmp/stort_regnestykke | Filen læses linie for linie ind i STDIN |
2>&1 | STDOUT og STDERR | backup /home > /tmp/backup_log 2>&1 | STDERR filhåndtag 2 omdirigeres samme sted som filhåndtag 1 |
Omdirigering af STDOUT
Som standard sendes STDOUT data fra processen til den aktive skærm. Det er muligt at omdirigere datastrømmen fra processens STDOUT til en fil ved at benytte omdirigeringstegnet >
[heth@mars ~]$ <input>grep error /var/log/stor_logfil > /tmp/errors</input>
[heth@mars ~]$ <input>cat /tmp/errors</input>
Aug 19 08:16:53 mars sshd[7359]: error: ssh_msg_send: write
Aug 19 09:12:32 mars sshd[7852]: error: ssh_msg_send: write
Aug 19 18:16:18 mars sshd[12351]: error: ssh_msg_send: write
Aug 20 03:04:16 mars sshd[13155]: error: ssh_msg_send: write
Aug 19 07:21:47 mars sshd[14256]: error: ssh_msg_send: write
Omdirigering af STDERR
Som standard sendes STDERR data fra processen til den aktive skærm. Det er muligt at omdirigere datastrømmen fra processens STDERR til en fil ved at benytte omdirigeringstegnet 2>.
Denne funktion kan for eksempel anvendes ved ikke øvervåget sikkerhedskopiering for at opsamle alle fejlbeskeder til senere analyse. Ellers ville beskederne bare rulle ovenud på skærmen.
[heth@mars ~]$ <input>date</input>
Fri Aug 21 15:26:47 CEST 2009
[heth@mars ~]$ <input>backup /home 2>/tmp/backup_log_Aug22</input>
Backing up /home/.snap
Backing up /home/heth
Backing up /home/heth/.cshrc
Backing up /home/heth/.login
Backing up /home/heth/.login_conf
Backing up /home/heth/.mailrc
Backing up /home/heth/.profile
<notice> Tusinder af linier her </notice>
Check af om backupen gik godt
[heth@mars ~]$ <input>date</input>
Mon Aug 24 08:01:47 CEST 2009
[heth@mars ~]$ <input>cat /tmp/backup_log_Aug22</input>
File busy: /home/hdje/doc/letter3.doc
Omdirigering af STDIN
Som standard modtager STDIN data fra tastaturet. Det er muligt at omdirigere datastrømmen fra tastaturet til en fil ved at benytte omdirigeringstegnet <.
Hvis der for eksempel ønskes periodisk sikkerhedskopiering af de 127 vigtigste filer og biblioteker på maskinen, laves en fil med en liste over de vigtige filer. En pr linie.
[heth@mars ~]$ <input>backup < /etc/vigtige_filer_liste </input>
Backing up /var/database/kunder
Backing up /var/database/leverandorer
Backing up /var/database/okonomi
Backing up /home/hejhr/projekt
<notice> Mange linier her</notice>
Flere omdirigeringer samtidig
der er muligt at kombinere omdirigeringer.
[heth@mars ~]$ <input>backup < /etc/vigtige_filer 2>> /tmp/backup_errors 1>> /tmp/backup_files </input>
Pipes - sammenkobling af processer
Ved at anvende pipe-symbolet | kan STDOUT fra en process pipes til STDIN på en anden process. Se principtegning og ekesempel herunder. STDERR fra begge processer sendes til skærmen.
I eksemplet herunder vil kommandoen find /home -ctime -24h finde alle filer under biblioteket /home som er ændret inden for de sidste 24 timer, og skrive deres tilnavne ud på STDOUT. STDOUT er imidlertidigt pipet til backup kommandoen som tager tager backup af de filer den modtager via STDIN.
[heth@mars ~]$ <input>find /home -ctime -24h | backup</input>
STDERR via Pipen
Hvis STDERR datastrømmen ønskes sendt videre gennem Pipen til STDIN på den efterfølgende process kan 2>&1 anvendes.
I eksemplet herunder checker programmet chkdb databasen mercantec. STDIN og STDERR fra chkdb pipes til programmet lp som printer informationen til en printer der hedder laser3.
[heth@mars ~]$ <input>chkdb mercantec 2>&1 | lp -p laser3</input>
Beregninger i scripts
Følgende eksempel viser hvor meget performance der kan vindes ved at anvende den indbyggede funktion let i bash i stedet for at anvende det separate program expr. Grunden til at det tager så lang tid at anvende expr er at bash skal starte en ny process hvergang expr udføres. (100.000 gange ialt)
[heth@mars ~]$ <input>cat test-let-expr</input>
#!/usr/bin/bash
echo "#################### using let ####################"
A=0
TIMESTART=$(date +%s)
while test $A -lt 100000
do
let A=A+1
done
let TIME=`date +%s`-TIMESTART
echo "It took $TIME seconds for let to count to $A"
echo "#################### using expr ###################"
A=0
TIMESTART=$(date +%s)
while test $A -lt 100000
do
A=`expr $A + 1`
done
let TIME=`date +%s`-TIMESTART
echo "It took $TIME seconds for expr to count to $A"
[heth@mars ~]$ <input>./test-let-expr</input>
#################### using let ####################
It took <notice>4</notice> seconds for let to count to 100000
#################### using expr ###################
It took <notice>250</notice> seconds for expr to count to 100000
BEMÆRK: I eksemplet ovenfor at VARIABEL=$(kommando) er det samme som VARIABEL=`kommando`
Job kontrol
Job kontrol kan anvendes til at styre flere kørende programmer samtifig. Et kørende program kan suspenderes - dvs. stoppes - og resume - dvs. fortsætte - på et senere tidspunkt. Jobs kan køre i baggrunden - det vil sige ikke med standard output på skærmen.
Funktion | kommando |
---|---|
Stoppe kørende program i forgrunden | <CTRL>-Z |
Se stoppede programmer og jobnumre | jobs |
Forsætte stoppet program i forgrunden | fg [job-nummer] |
Fortsætte stoppet program i baggrunden | bg [job-nummer ...] |