Difference between revisions of "Bash processer"

From Teknologisk videncenter
Jump to: navigation, search
m (New page: Denne artikel er en del af bash = bash og processer = Processer er de programmer der kører på maskinen og programmer du starter i '''bash'''. For eksempel startes herunder progra...)
 
m (Omdirigering af standard datastrømme)
 
(8 intermediate revisions by the same user not shown)
Line 1: Line 1:
Denne artikel er en del af [[bash]]  
+
Denne artikel er en del af [[bash]] artiklerne
  
  
Line 18: Line 18:
 
devfs          1.0K    1.0K      0B  100%    /var/named/dev
 
devfs          1.0K    1.0K      0B  100%    /var/named/dev
 
</source>
 
</source>
= Hvilke processer kører på maskinen =
+
= Bash starter nye processer =
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.
+
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.
  
 +
I eksemplet herunder kan det ses de processer som kører for brugeren. Læg mærke til at processen [[ps]] viser sig selv da den selv er kørende. Læg også mærke til at ''ps -l'' har '''PPID''' - Parent Process ID - 84655 som er den '''PID''' - Process ID - som [[bash]] har. Det viser at [[bash]] har starter [[ps]]
 +
<source lang=cli>
 +
[heth@mars ~]$ <input>ps -l</input>
 +
  UID  PID  PPID CPU PRI NI  VSZ  RSS MWCHAN STAT  TT      TIME COMMAND
 +
1001 <notice>84655</notice> 84654  0  8  0  4396  2004 wait  S    p0    0:00.04 -bash (bash)
 +
1001 84753 <notice>84655</notice>  0  44  0  3244  876 -      R+    p0    0:00.00 ps -l
 +
</source>
 
== Fødslen af et process ==
 
== 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.
 
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.
Line 55: Line 62:
 
</source>
 
</source>
  
== Omdirigering af standard datastrømme ==
+
= Omdirigering af standard datastrømme =
 
{|border=1 ;style="margin: 0 auto; text-align: center;cellpadding="5" cellspacing="0"
 
{|border=1 ;style="margin: 0 auto; text-align: center;cellpadding="5" cellspacing="0"
 
|- bgcolor=lightgrey
 
|- bgcolor=lightgrey
Line 71: Line 78:
 
|-
 
|-
 
|2>&1 || STDOUT og STDERR || backup /home > /tmp/backup_log 2>&1 || STDERR filhåndtag 2 omdirigeres samme sted som filhåndtag 1
 
|2>&1 || STDOUT og STDERR || backup /home > /tmp/backup_log 2>&1 || STDERR filhåndtag 2 omdirigeres samme sted som filhåndtag 1
 +
|-
 +
|<<||STDIN
 +
|cat << EOF > file
 +
Linje 1 i filen<br/>
 +
Linje 2 filen<br/>
 +
Sidste linje i filen<br/>
 +
EOF
 +
|Here-document
 +
|-
 +
|<<< || STDIN || bc <<< 10+90 || Here-string
 +
|-
 
|}
 
|}
=== Omdirigering af STDOUT ===
+
== 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 '''>'''
 
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 '''>'''
 
{|
 
{|
Line 86: Line 104:
 
Aug 19 07:21:47 mars sshd[14256]: error: ssh_msg_send: write
 
Aug 19 07:21:47 mars sshd[14256]: error: ssh_msg_send: write
 
</source>
 
</source>
=== Omdirigering af STDERR ===
+
== 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>'''.  
 
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>'''.  
 
{|
 
{|
Line 112: Line 130:
 
File busy: /home/hdje/doc/letter3.doc
 
File busy: /home/hdje/doc/letter3.doc
 
</source>
 
</source>
=== Omdirigering af STDIN ===
+
== 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 '''<'''.  
 
Som standard modtager STDIN data fra tastaturet. Det er muligt at omdirigere datastrømmen fra tastaturet til en fil ved at benytte omdirigeringstegnet '''<'''.  
 
{|
 
{|
Line 126: Line 144:
 
<notice> Mange linier her</notice>
 
<notice> Mange linier her</notice>
 
</source>
 
</source>
=== Flere omdirigeringer samtidig ===
+
== Flere omdirigeringer samtidig ==
 
der er muligt at kombinere omdirigeringer.
 
der er muligt at kombinere omdirigeringer.
 
<source lang=cli>
 
<source lang=cli>
[heth@mars ~]$ <input>backup < /etc/vigtige_filer 2>> /tmp/backup_errors 1>> /tmp/backup_files </input>
+
[heth@mars ~]$ <input>backup < /etc/vigtige_filer 2>> /tmp/backup_errors 1>> /tmp/backed_up_files </input>
 
</source>
 
</source>
== Pipes - sammenkobling af processer ==
+
 
 +
= 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.
 
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.
 
{|
 
{|
Line 140: Line 159:
 
[heth@mars ~]$ <input>find /home -ctime -24h | backup</input>
 
[heth@mars ~]$ <input>find /home -ctime -24h | backup</input>
 
</source>
 
</source>
=== STDERR via Pipen ===
+
== STDERR via Pipen ==
 
Hvis STDERR datastrømmen ønskes sendt videre gennem Pipen til STDIN på den efterfølgende process kan '''2>&1''' anvendes.
 
Hvis STDERR datastrømmen ønskes sendt videre gennem Pipen til STDIN på den efterfølgende process kan '''2>&1''' anvendes.
 
{|
 
{|
Line 149: Line 168:
 
[heth@mars ~]$ <input>chkdb mercantec 2>&1 | lp -p laser3</input>
 
[heth@mars ~]$ <input>chkdb mercantec 2>&1 | lp -p laser3</input>
 
</source>
 
</source>
== 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)
 
<source lang=cli>
 
[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
 
</source>
 
'''''BEMÆRK:''''' I eksemplet ovenfor at ''VARIABEL=$(kommando)'' er det samme som ''VARIABEL=`kommando`''
 
  
 
= Job kontrol =
 
= Job kontrol =
Line 196: Line 184:
 
|Fortsætte stoppet program i baggrunden || bg [job-nummer ...]
 
|Fortsætte stoppet program i baggrunden || bg [job-nummer ...]
 
|}
 
|}
{{#css:
+
{{Source cli}}
   
 
    pre {  font-family: Lucida Console; font-weight: bold; font-size: 14px; color: #00FF00; background: black; margin: 10px 50px; width: 800px; line-height: 200%; overflow: auto;}
 
}}
 
  
 
= Eksterne henvisninger =
 
= Eksterne henvisninger =

Latest revision as of 07:00, 19 December 2022

Denne artikel er en del af bash artiklerne


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

Bash starter nye processer

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.

I eksemplet herunder kan det ses de processer som kører for brugeren. Læg mærke til at processen ps viser sig selv da den selv er kørende. Læg også mærke til at ps -l har PPID - Parent Process ID - 84655 som er den PID - Process ID - som bash har. Det viser at bash har starter ps

[heth@mars ~]$ <input>ps -l</input>
  UID   PID  PPID CPU PRI NI   VSZ   RSS MWCHAN STAT  TT       TIME COMMAND
 1001 <notice>84655</notice> 84654   0   8  0  4396  2004 wait   S     p0    0:00.04 -bash (bash)
 1001 84753 <notice>84655</notice>   0  44  0  3244   876 -      R+    p0    0:00.00 ps -l

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
En processes standard input/output. Der kan tastes på tastaturet til processen for eksempel vi editoren og tekst og fejlbeskeder vises på 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
<< STDIN cat << EOF > file

Linje 1 i filen
Linje 2 filen
Sidste linje i filen
EOF

Here-document
<<< STDIN bc <<< 10+90 Here-string

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 >

Omdirigering af STDOUT
[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>.

Omdirigering af STDERR

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 <.

Omdirigering af STDIN

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/backed_up_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.

STDOUT fra process 1 pipes til STDIN på process 2. 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.

STDOUT og STDERR fra process 1 pipes til STDIN på process 2.

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>


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 ...]


Eksterne henvisninger