Inleiding
Opnieuw gaan de handschoenen uit, en werken we met een CLI (command
line interface). We gaan ons wat meer verdiepen in de ideeen die aan
unix en linux ten grondslag liggen. We bekijken de mogelijkheden van
de command interpreter, ook wel shell
genoemd. En bestuderen enkele tools uit de linux toolbox. Ook kijken
we hoe we vat kunnen krijgen op programma's in uitvoering ((processen).
De shell
De command interpreter onder Unix heet shell. Er zijn diverse smaken
in omloop; de standaard shell heet Bourne shell, genoemd naar de
ontwerper. Daarnaast zijn er de C-schell, korn-shell, esh etc.
Linux gebruikers passen meestal de vernieuwde Bourne shell met de naam
bash toe (bash = borne again shell).
Als bij het inloggen een shell wordt opgestart, wordt in de
HOME-directory eerst gezocht naar de file .profile. Deze file wordt
door de shell uitgevoerd.
(vgl AUTOEXEC.BAT van DOS). Voor bash bestaat er een aantal files, die
de werking van de shell bepalen. Deze bestanden hebben een naam die
begint met een punt. Gevolg hiervan is dat ze normaal niet door ls
weergegeven worden. Het commando ls -a doet dat wel. Voor bash vinden
we: .bash_history .bash_logout .bash_profile .bashrc
De eerder genoemde .profile heet dus voor bash .bash_profile.
Na inloggen verschijnt de $-promt van de shell op het scherm In
principe zijn er nu drie communicatie kanalen open: stdin leest van
het toetsenbord, stdout schrijft
naar het scherm en stderr schrijft ook naar het scherm.
Let op: afhankelijk van de implementatie kan de promt
er wel eens anders uitzien.
Een aantal shell variabelen zijn te zien met het commando set.
Let op: Unix maakt onderscheid tussen hoofd en kleine letters. SET is
dus iets heel anders dan set.
Opdracht: Log in en zoek uit wat je HOME directory is. Bekijk de shell
variabelen met set.
De variable PATH geeft aan in welke directories naar commando's
gezocht gaat worden.
Als je wil weten uit welke subdirectory van je PATH het commando komt
kun je het commando which
Tik maar eens in: which ls
Opdracht: Kijk waar je in het filesysteem zit met het commando pwd.
Eenvoudige commando's
We geven hier een korte herhaling van een aantal commando's die we in
sessie 1 al tegen gekomen zijn.
informatie
- ls geeft en lijst van files in de huidige directory
(workdirectory).
De vlag -l toegepast bij ls geeft een meer uitgebreide lijst
Van elke file worden nu ook de leesrechten, schrijfrechten en
executierechten voor resp. de eigenaar, de users uit dezelfde
groep als de eigenaar en de rest van de gebruikers gegeven. Hier
blijkt de multi-user eigenschap van Unix.
Van elke file is in te stellen wie er wat mee mag doen.
Een commando optie noemt men ook wel vlag (zoals hier dus -l),
vrijwel alle vlaggen worden in Unix voorafgegaan door een
min-teken.
Let er ook op dat tussen de ls en de -l een spatie staat. ls-l is
namelijk in Unix een geldige filenaam. Er wordt dan via het PATH
naar het bestand ls-l gezocht en dit zal meestal niet gevonden
worden.
- man is een on-line help commando.
Man drukt de Unix manual pagina
van een commando op het scherm af, probeer eens man ls.
Let op: op niet alle systemen zijn de manuals aanwezig.
filemanipulatie
- cp filenaam nieuwenaam
kopieert de inhoud van filenaam naar een bestand met de naam
nieuwenaam.
opdracht: controleer deze bewering met het commando man cp}
- rm filenaam
verwijdert filenaam. Dit commando kan een hele lijst van filenamen
meekrijgen.
veel gebruikte commando's
- cd werkt bijna hetzelfde als de MS-DOS variant. cd alleen (dus
zonder een directory op de commandoregel) doet een change
directory naam HOME.
- pwd
print de huidige directory.
- who geeft aan wie er allemaal op het systeem ingelogd zijn.
- cat filenaam
stuurt de inhoud van filenaam naar het beeldscherm (stdout)
Wanneer cat meer filenamen aangeboden krijgt worden de
file-inhouden achter elkaar geplakt en naar het scherm gestuurd
(cat staat voor: concatenate).
- less zorgt ervoor dat output naar het scherm in hapklare brokken
verschijnt. Een alternatief voor less is het wat oudere commando more dat wat minder
mogelijkheden heeft.
- pico is een eenvoudige text-editor voor het aanmaken van
ASCII-teksten.
- vi is een meer geavanceerde editor. Vi kent twee modes: command en
insertion mode. Sommige mensen kunnen hier maar niet aan wennen,
anderen willen niets anders meer.
- echo joepie
print joepie (dit mag een willekeurige string zijn) op stdout. De
waarde van shellvariabelen kan men met echo zien door ze vooraf te
laten gaan door $
voorbeeld: echo $HOME
IO-redirection en special files
Met het symbool > is de output naar een file te voeren.
voorbeeld:
echo hoi > aap
Voer dit uit en bekijk de inhoud van aap
echo hallo > aap
idem maar nu
echo hoi >> aap
Wat is er gebeurd? Wat is nu de inhoud van aap (cat aap)?
Bij een enkele >, wordt er een nieuwe file aangemaakt.
Met >> blijft de inhoud van een eventueel bestaande file
gehandhaafd en wordt de output er achteraan toegevoegd (append).
Deze redirection werkt voor alle commando's die iets naar het scherm
sturen.
ls -l >dirlist
Deze file waarnaar geredigeerd wordt kan een special file
zijn zoals een file uit de /dev directory,
dat wil zeggen een file die gekoppeld is aan een device
De standaard input is via het < teken te veranderen
Processen
Elk programma in uitvoering heet een process.
De processen zijn te bekijken
met het commando ps.
Door achter een shell commando een & te tikken wordt het nieuwe
process op de achtergrond gestart. Dat wil zeggen dat de shell niet
wacht tot het comanndo klaar is maar direct weer klaar staat voor een
nieuw commando.
opdracht: tik het volgende in:
while :
do
sleep 20
echo gaap
done &
(toelichting: er wordt oneindige while-lus gemaakt waarin er gedurende
20 seconden wordt geslapen en waarna het woordje gaap op het scherm
gezet wordt).
Op het moment dat je de return intikt komt er een nummertje op je
scherm. Dit is het process-nummer of ookwel Process ID (PID) van het
achtergrondprocess.
Tik nu ps in om de achtergrondprocessen te bekijken.
Meer informatie is te verkrijgen met het commando
ps axl (doe eerst een 'man ps').
Een achtergrondprocess is een signaal te sturen met het commando
kill PID
Hierin is PID dus het process-id van het achtergrond process (zie ps
commando; je moet dus een getal intypen!)
Als je een achtergrondprocess hebt gestart geeft de shell eerst het
pid van het achtergrondprocess alvorens de shell-prompt weer
verschijnt.
opdracht: kill het achtergrondprocess
Let op: het achtergrond process is zelf ook een bash. Deze shell voert
het shell programma uit en maakt op zijn beurt ook weer nieuwe
processen aan (in dit geval een sleep process en een echo process).
Het heeft geen zin de sleep te killen, aangezien de moedershell dan
meteen een echo doet en een nieuw sleep process start. Probeer dit
maar eens uit. Men zegt dat de sleep en de echo kind-processen (child
processes) zijn van de achtergrond
shell, die op zijn (of haar) beurt weer een child is van de shell
waarin je het commando hebt ingetikt.
Het vorige achtergrondprocess schreef telkens output naar het scherm
dus het interfereerde op hinderlijke wijze met de shell
Tik nu het volgende meerregelig shell-commando in
while :
do
sleep 20
echo gaap >> gaapfile
done &
De ouput wordt nu 'geredirect' naar een file.
Bekijk met ls -l de directory. Is de filegrootte van gaapfile
constant?
Waarom gebruikt het commando >> (bedenk het is een while-lus die elke
keer doorlopen wordt)
Opmerking: soms zijn processen niet met kill alleen te killen, gebruik
dan We hebben dan een zwaardere kogel nodig. deze wordt als vlag aan
kill meegegeven.
(eigenlijk geeft kill een signal naar een process. Het signal 9 is
het KILL signal)
kill -9 pid
Een gebruiker kan alleen zijn eigen processen killen. Alleen de
superuser kan alle processen killen.
Pipes en filters
Opnieuw wat commando's
Bekijk met met man commando de werking van de volgende commando's:
(dus man wc, man sort en man grep)
- wc (word count)
- sort (sorteert)
- grep (zoek tekst in file)
wc /etc/passwd
telt het aantal characters woorden en regels in een file met naam
passwd in de directory etc die weer een subdirectory is van de
rootdirectory /.
In het volgende voorbeeld zijn twee processen via een pipe gekoppeld.
In zo'n geval wordt de output van het eerste process gekoppeld met de
input van het tweede process.
De benodigde files zijn:
logfile,
xxx,
yyy en
zzz.
Plaats deze bestanden in je eigen HOME-directory door met de rechter muisknop op de filenaam te klikken en save link te kiezen.
En voer de volgende commando's uit:
cat xxx yyy zzz | sort
de inhoud van xxx, yyy en zzz wordt met cat aan elkaar gekoppeld,
terwijl sort de hele zaak sorteert
De output is met redirection weer in een nieuwe file op te vangen.
Deze pipelines zijn verder uit te breiden
cat yyy | grep yyy | wc -l
hoe vaak komt er een regel met het woord yyy in de files xxx en yyy
voor? Het is nu mogelijk eenvoudige zaken op een elegante manier te
programmeren zonder kennis van een programmeertaal. Uitsluitend met de
nu geleerde tools.
Logfile is een file aan waarin meldingen van een industiele besturing
zijn opgeslagen. Bekijk deze logfile met more.
Uit deze logfile is met de genoemde commando's informatie te putten
Er zijn normale meldingen en foutmeldingen
- extraheer alle foutmeldingen
- idem maar alleen met betrekking tot kleppen
- hoe vaak was er storing aan klep 3?
Geef voor alle bovengenoemde vragen een Linux commando dat het
antwoord geeft.
Scripts
Shell commando's zijn in een text-file te plaatsen en kunnen dan
als batch-file uitgevoerd worden.
opdracht: maak met pico of vi (als je dat aandurft) een
bestand aan met de naam poging. Zet hierin een aantal shell coammndo's
en sluit de edit sessie af. Maakt de file executeerbaar met het
commando
chmod +x poging
Voer vervolgens het script uit en controleer het resultaat.
Let op: als PATH niet een verwijzing naar de huidige directory bevat,
moet je het commando vooraf laten gaan door ./ (hier dus ./poging).
Op deze wijze zorgt je ervoor dat de shell het commando vindt.
Wildcards
Linux en bash kunnen prima met wildcards overweg.
* willekeurig stuk van een filenaam
? willekeurig teken van een filenaam
[ ] tussen haken staat een verzameling tekens,
waarvan een enkele gekozen wordt.
\c met een backslash kan een speciaal karakter
ontdaan worden van zijn betekenis.
Voorbeelden:
??? matcht alle filenamen van drie tekens.
*.c matcht alle filenamen die eindigen op .c
*.[ch] match alle filenamen die eindigen op .c of op .h
hallo\? matcht de filenaam hallo? (maar niet hallo!)
Opdracht: experimenteer met * ? [ en ]
|
Wat heb je geleerd?
- De volgende shell commando's: ls, cp, rm, cd, pwd, who, cat, less,
echo, kill, sleep, wc, sort, grep, chmod, mount, man
- Je kunt de betekenis van de verschillende opties van de commando's
achterhalen m.b.v. het man commando.
- Je kunt de betekenis achterhalen van nog onbekende shell
commando's m.b.v. man.
- Je kunt tekstfiles aanmaken m.b.v. nano of vi.
- Je hebt kennis gemaakt met IO redirection.
- Je hebt kennis gemaakt met het pipe mechanisme.
- Je kunt shellcommando's groeperen in eenvoudige shell scripts.
- Je kunt processen opsporen en killen (als je de eigenaar bent)
- Je kent de betekenis van wildcards.
Opdrachten thema 3
- Beschrijf de betekenis van de volgende commando's:
- ls -lisaf
- ls ..
- grep test /etc/passwd
- cat file.txt | wc -w (file.txt is een gegeven tekstbestand)
- cat file.txt | cut -c 1-3 | sort
- Voer de opdrachten bij het onderdeel Pipes en filters uit.
- Schrijf een shell script genaamd
- ... tel, dat na aanroep op het beeldscherm
aangeeft hoeveel accounts er op de machine zijn.
- ... zoek, dat na aanroep d.m.v. zoek pietje
de regels in /etc/passwd afdrukt waarin pietje voorkomt. (tip:
binnen dit script kan je de variabele $1 gebruiken, die bij
het starten van zoek pietje, de waarde pietje overneemt.
- ... hoeveel, dat op het scherm weergeeft hoeveel mensen op
dit
moment ingelogd zijn (tip: onderzoek eerst het commando w)
|