Table of Contents

Laborator 04 - Instalarea și utilizarea aplicațiilor

Pornirea și oprirea aplicațiilor

Pe un sistem se găsesc mai multe aplicații. Utilizatorul pornește aplicația potrivită pentru o nevoie pe care o are. De exemplu, pornește un browser web pentru a accesa Wikipedia sau pornește aplicația Spotify pentru a asculta muzică.

Utilizatorul poate porni aplicațiile folosind interfața grafică (Graphical User Interface, GUI) sau interfața în linia de comandă (Command Line Interface, CLI). În cazul interfeței grafice pornirea se face folosind elementele grafice (mouse, meniuri, iconuri de desktop). În cazul interfeței în linia de comandă pornirea se face introducând și rulând comenzi.

Pornirea și oprirea aplicațiilor grafice

Reminder: Pornirea aplicațiilor din interfața grafică

Am prezentat informații despre pornirea și oprirea aplicațiilor grafice în Laboratorul 1: Acomodarea în Linux. Am văzut că o aplicație grafică poate fi pornită în 2 moduri:

  1. Folosind iconuri în interfața grafică. Iconurile se găsesc direct pe desktop sau în barele de desktop sau în meniurile și ferestrele mediului grafic. Plasarea iconurilor depinde de distribuția folosită.
  2. Folosind un prompt de tip application launcher. Acest prompt este lansat, în Linux, de combinația de taste Alt+F2. În Windows se folosește combinația de taste Windows+r. În macOS se folosește combinația de taste Command+Space. La acest prompt se introduce șirul (comanda) care identifică aplicația.
Exerciții
  1. Porniți o aplicație browser de fișiere (file browser) folosind Alt+F2. În Ubuntu 22.04 GNOME browserul de sistem de fișiere este Nautilus, identificat de șirul (comanda) nautilus.
  2. Porniți aplicația Settings, identificată de șirul (comanda) gnome-control-center, folosind Alt+F2.
  3. Porniți aplicația ls (de listare a conținutului unui director în linia de comandă (CLI)) folosind Alt+F2. Observați că nu este afișat nimic. Acest lucru se întâmplă pentru că aplicația ls nu are interfața grafică; are sens să fie rulată doar din linia de comandă.

Pornirea unei aplicații grafice folosind linia de comandă

Pe lângă cele două moduri de mai sus, pornirea unei aplicații grafice poate fi realizată din linia de comandă (CLI), folosind șirul care identifică aplicația, la fel că în cazul folosirii Alt+F2. Pentru a porni o aplicație grafică din linia de comandă, avem nevoie de un terminal. Terminalul este un dispozitiv în care rulează o aplicație numită shell, care este interpretorul comenzilor introduse. Pe parcursul acestui capitol și a întregii cărți vom folosi interschimbabil shell și terminal.

Pornim o aplicație de terminal folosind fie iconul corespunzător, fie Alt+F2 urmat de șirul (comanda) gnome-terminal. În aplicația de terminal, pornim aplicația Firefox scriind șirul (comanda) firefox, urmat de apăsarea tastei Enter, ca în imaginea de mai jos. Aplicația Firefox va porni.

Ponirea Firefox din linia de comandă

În acest moment, în aplicația de terminal nu mai putem introduce noi comenzi pentru a porni alte aplicații. Va trebui să oprim aplicația Firefox. Oprim aplicația Firefox din mediul grafic (click pe butonul de închidere a ferestrei sau folosirea combinației de taste Alt+F4) sau din terminal, folosind combinația de taste Ctrl+c.

Exerciții
  1. La fel ca mai sus, porniți o aplicație browser de fișiere (file browser) folosind linia de comandă. În Ubuntu 22.04 GNOME, browserul de sistem de fișiere este nautilus.
  2. Porniți aplicația Settings folosind linia de comandă.

Menținerea accesului la terminal

Atunci când pornim o aplicație grafică din linia de comandă, aplicația “acaparează” terminalul; nu mai putem introduce noi comenzi pentru a porni alte aplicații. Putem rezolva acest lucru prin trecerea aplicației grafice în backgroundul shellului. Adică urmăm pașii:

  • Pornim, în terminal, aplicația grafică (Firefox) folosind comanda firefox. Spunem că aplicația rulează în foreground și controlează terminalul; adică nu permite rularea unei alte comenzi.
  • În terminal, folosim combinația de taste Ctrl+z pentru a trece aplicația în background. În acest moment, avem din nou promptul terminalului, ca mai jos:
student@uso:~$ firefox
^Z
[1]+  Stopped                 firefox
  • Dar aplicația este acum “înghețată”, nu mai răspunde. Spunem că este suspendată.
  • Folosim, în terminal, comanda bg, ca mai jos:
student@uso:~$ bg
[1]+ firefox &
  • Astfel am “dezghețat” aplicația, care acum este interactivă.

În acest mod, avem aplicația Firefox în rulare și avem acces la terminal să introducem noi comenzi.

Exercițiu: Folosiți pașii de mai sus pentru a porni și aplicația Settings din linie de comandă și să mențineți accesul la terminal.

Vom afla mai multe despre background și suspendarea proceselor în secțiunea Rularea aplicațiilor.

Exerciții de aprofundare

Porniți aplicațiile grafice:

  • Gedit (identificată de șirul gedit), editor
  • Calculator (identificată de șirul gnome-calculator), calculator basic
  • Trash (identificată de șirul nautilus trash://), coș de gunoi

Porniți fiecare aplicație în două moduri:

  1. Folosind Alt+F2.
  2. Folosind interfața în linia de comandă (CLI).

Pornirea aplicațiilor în linia de comandă

Pornirea de aplicații CLI folosind linia de comandă

Aplicațiile CLI, numite și utilitare, sunt proiectate pentru a fi pornite și folosite în linia de comandă. Cel mai adesea numim aplicațiile în linie de comandă utilitare sau, pur și simplu, comenzi. Scriem numele utilitarului / comenzii într-un terminal și utilitarul va fi pornit1). De exemplu, dacă dorim să afișăm utilizatorii prezenți în sistem, pornim o aplicație de terminal și folosim utilitarul who:

student@uso:~$ who
student  :0           2020-09-04 17:42 (:0)
student  pts/0        2020-09-19 15:57 (192.168.56.1)

Sau, dacă dorim să vedem câtă memorie avem (disponibilă) în sistem, folosim utilitarul free:

student@uso:~$ free
              total        used        free      shared  buff/cache   available
Mem:        2040972     1025716       83824       32916      931432      794692
Swap:        777300       37056      740244
Exerciții
  1. Porniți utilitarul ls (de listare a conținutului unui director în linia de comandă (CLI)) folosind linia de comandă.
  2. Porniți utilitarul df (de afișare a spațiului ocupat pe disc) folosind linia de comandă.

Argumente în linia de comandă

Pentru a porni aplicații / utilitare în linia de comandă, folosim comenzi care conțin numele utilitarului urmate, eventual, de argumente. Astfel, pentru a porni utilitarele ls sau ps, folosim comenzi precum cele de mai jos, simple sau cu argumente:

student@uso:~$ ls
Desktop  Documents  Downloads  examples.desktop  Music  Pictures  Public  snap  Templates  uso.git  Videos  vm-actions-log.txt
student@uso:~$ ls -l
total 60
drwxr-xr-x  2 student student 4096 Aug  6  2018 Desktop
drwxr-xr-x  3 student student 4096 Aug 20  2018 Documents
drwxr-xr-x  2 student student 4096 Aug  6  2018 Downloads
-rw-r--r--  1 student student 8980 Aug  6  2018 examples.desktop
drwxr-xr-x  2 student student 4096 Aug  6  2018 Music
drwxr-xr-x  2 student student 4096 Aug  8 11:52 Pictures
drwxr-xr-x  2 student student 4096 Aug  6  2018 Public
drwxr-xr-x  3 student student 4096 Aug  8 09:02 snap
drwxr-xr-x  2 student student 4096 Aug  6  2018 Templates
drwxr-xr-x 14 student student 4096 Aug 20  2018 uso.git
drwxr-xr-x  2 student student 4096 Aug  6  2018 Videos
-rw-r--r--  1 student student 4827 Aug 21  2018 vm-actions-log.txt
student@uso:~$ ps
  PID TTY          TIME CMD
 3370 pts/4    00:00:00 bash
 7979 pts/4    00:00:00 ps
student@uso:~$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
student   3370  3369  0 08:55 pts/4    00:00:00 -bash
student   7982  3370  0 13:17 pts/4    00:00:00 ps -f

Aplicații interactive în linia de comandă

Utilitarele ls și ps, pe care le-am folosit mai sus, pornesc, rulează, afișează informații utilizatorului în terminal și apoi se opresc. Alte utilitare în linia de comandă sunt interactive. Adică folosesc date introduse de utilizator și își încheie execuția doar după introducerea acestor date sau la comanda utilizatorului.

De exemplu, utilitarul less, folosit pentru afișarea paginată a conținutului unui fișier, este interactiv. Îl folosim ca mai jos:

student@uso:~$ less /etc/services

O dată pornit utilitarul, putem controla afișarea sa folosind tastele săgeți sau alte combinații de taste precum Ctrl+b (pagină sus) sau Ctrl+f (pagină jos). Pentru a opri utilitarul folosim tasta q (quit) și obținem controlul terminalului pentru a introduce noi comenzi.

Exercițiu: Porniți în linia de comandă aplicația interactivă vim pentru a edita fișierul ~/.bashrc. Opriți aplicația folosind combinația de taste <Esc>:q! urmată de Enter.

Oprirea forțată a aplicațiilor în linia de comandă

Se poate întâmpla ca o aplicație în linia de comandă să ruleze pentru prea mult timp sau să se blocheze. Caz în care dorim să o oprim. Soluția de avarie este să închidem fereastra de terminal, lucru care, de obicei, închide și aplicația. Soluția mai bună este să închidem doar aplicația. Acest lucru îl facem folosind combinația de taste Ctrl+c care oprește aplicația care rulează în terminal2). Acest lucru poate fi realizat și pentru aplicații grafice, așa cum am văzut mai sus.

De exemplu, dacă folosim comanda sleep 100 care se va bloca pentru 100 de secunde, o vom opri folosind Ctrl+c ca mai jos:

student@uso:~$ sleep 100
^C
student@uso:~$

Exercițiu: Folosiți următoarele comenzi care pornesc aplicații care durează mult și opriți-le forțat:

  • ls -R /usr: pentru a afișa recursiv conținutul directorului /usr
  • watch ps: pentru a monitoriza procesele din terminalul curent

Rularea aplicațiilor

Pornirea unei aplicații înseamnă că se alocă resursele sistemului (procesor, memorie, dispozitive de intrare/ieșire) pentru a rula aplicația. O aplicație care rulează, adică folosește resursele sistemului pentru a executa cod și a prelucra date, se numește proces. Atunci când pornim o aplicație, se creează un proces; atunci când oprim aplicația, sau când își încheie execuția, ne referim la încheierea execuției procesului.

Procesul este pornit dintr-un fișier executabil care conține codul (instrucțiunile) și datele aplicației. Fișierul executabil mai este numit și imaginea procesului. Fișierul executabil este un program. Spunem că procesul este un program aflat în execuție3).

Identificarea fișierului executabil al unei aplicații

Fișierul executabil al unei aplicații este încărcat în memoria sistemului și codul este executat; din acest moment spunem că aplicația rulează.

De exemplu aplicația Firefox (browser web) are asociat fișierul executabil /usr/bin/firefox; aplicația Vim (editor) are asociat fișierul executabil /usr/bin/vim; aplicația nano (editor de text) are asociat fișierul executabil /usr/bin/nano. Putem identifica fișierul executabil al unei aplicații folosind comanda which, urmată de comanda pentru pornirea aplicației ca mai jos:

student@uso:~$ which firefox
/usr/bin/firefox
student@uso:~$ which vim
/usr/bin/vim
student@uso:~$ which nano
/usr/bin/nano

Exercițiu: Identificați fișierul executabil al aplicațiilor / utilitarelor shutter, gedit, ls, df.

Investigarea proceselor

Un sistem de operare are de obicei mai multe aplicații care rulează, deci mai multe procese. Prea multe procese pot duce la o încărcare prea mare a sistemului, încetinind sau împiedicând funcționarea acestuia. Anumite procese pot consuma excesiv resurse afectând celelalte procese. De aceea, este util să investigăm procesele unui sistem și consumul de resurse al acestora.

Listarea proceselor

La nivel mai degrabă didactic, putem vizualiza lista de procese a unui sistem. Utilitarul ps afișează procesele curente în sistem (un snapshot al proceselor sistemului). La o rulare simplă, utilitarul ps afișează procesele din terminalul curent:

student@uso:~$ ps
  PID TTY          TIME CMD
14897 pts/4    00:00:00 bash
14910 pts/4    00:00:00 ps

În terminalul curent (indicat de coloana TTY din afișare, adică terminalul pts/4) sunt două procese:

  1. procesul shell (bash) în care rulăm comenzi care creează noi procese;
  2. procesul de listare (ps) pe care tocmai l-am lansat prin comanda ps; practic se afișează pe sine

Pentru a afișa toate procesele sistemului folosim opțiunea -e (pentru everything) a utilitarului ps ca în comanda de mai jos:

student@uso:~$ ps -e
  PID TTY          TIME CMD
    1 ?        00:00:19 systemd
    2 ?        00:00:00 kthreadd
    4 ?        00:00:00 kworker/0:0H
    6 ?        00:00:00 mm_percpu_wq
    7 ?        00:00:09 ksoftirqd/0
    8 ?        00:00:06 rcu_sched
    9 ?        00:00:00 rcu_bh
   10 ?        00:00:00 migration/0
   11 ?        00:00:00 watchdog/0
[...]

Ierarhia proceselor

Un proces este creat de un alt proces. De exemplu, mai sus, procesul ps a fost creat dintr-un proces shell (bash). Procesul shell a fost, la rândul său, creat de un alt proces. Un proces are un proces părinte; un proces poate avea mai multe procese copil. Procesele sunt, așadar, parte dintr-o ierarhie.

Pentru a vizualiza ierarhia de procese, folosim utilitarul pstree:

student@uso:~$ pstree
systemd-+-ModemManager---2*[{ModemManager}]
        |-NetworkManager-+-2*[dhclient]
        |                `-2*[{NetworkManager}]
        [...]
        |-acpid
        |-avahi-daemon---avahi-daemon
        |-boltd---2*[{boltd}]
        |-colord---2*[{colord}]
        |-cron
        [...]
        |-systemd-+-(sd-pam)
        |         |-gnome-terminal--+-bash
        |         |                 `-3*[{gnome-terminal-}]
        [...]

În vârful ierarhiei de procese este procesul numit clasic init. În listarea de mai sus vedem că procesul din vârful ierarhiei este systemd. systemd4) este implementarea de init prezentă în cea mai mare parte a distribuțiilor Linux curente5).

Atributele proceselor

Utilitarul ps are o afișare tabelară a proceselor, fiecare coloană corespunzând unui atribut al proceselor. La o rulare simplă, așa cum am văzut mai sus sunt afișate patru coloane:

  • PID: reprezentând identificatorul procesului
  • TTY: terminalul în care rulează procesul (apare ? pentru un proces care nu are terminal - în general procesele de tip serviciu, numite și procese daemon nu au terminal)
  • TIME: timpul de rulare pe procesor (în ore, minute, secunde)
  • CMD: numele imaginii de proces (adică numele executabilului / programului din care a fost creat procesul)
Identificarea unui proces

PID (Process Id) este atributul esențial al procesului, un index care identifică procesul la nivelul sistemului. Un proces este identificat după PID, nu după numele executabilului (CMD). Putem avea mai multe procese create din același executabil, fiecare proces având PID-ul său6).

Pentru a verifica existența mai multor procese, o să creăm mai multe procese shell. Pentru început, deschidem mai multe sesiuni de terminal, folosind, de exemplu, Alt+F2 în mediul grafic și introducând comanda gnome-terminal în promptul creat. Apoi vizualizăm doar procesele create din executabilul bash rulând comanda:

student@uso:~$ ps -e | grep bash
 2181 pts/1    00:00:00 bash
 2194 pts/2    00:00:00 bash
 2205 pts/3    00:00:00 bash
14750 pts/0    00:00:00 bash
14897 pts/4    00:00:00 bash

Obținem un rezultat precum cel de mai sus. Sunt cinci procese, toate create din executabilul bash, cu cinci PID-uri diferite: 2181, 2194, 2205, 14705, 14879.

Afișarea atributelor unui proces

Un proces are mai mult decât cele patru atribute afișate la o rulare simplă a utilitarului ps. Pentru a afișa mai multe atribute, folosim opțiunea -f (de la full format) sau opțiunea -F (de la extra full format), ca mai jos:

student@uso:~$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
student  14897 14896  0 17:12 pts/4    00:00:00 -bash
student  15026 14897  0 17:46 pts/4    00:00:00 ps -f
 
student@uso:~$ ps -F
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
student  14897 14896  0  6056  5136   0 17:12 pts/4    00:00:00 -bash
student  15027 14897  0  9728  3340   0 17:46 pts/4    00:00:00 ps -F

Desigur, putem să combinăm aceste opțiuni cu opțiunea -e de afișare a tuturor proceselor:

student@uso:~$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug18 ?        00:00:19 /lib/systemd/systemd --system --deserialize 39
root         2     0  0 Aug18 ?        00:00:00 [kthreadd]
root         4     2  0 Aug18 ?        00:00:00 [kworker/0:0H]
root         6     2  0 Aug18 ?        00:00:00 [mm_percpu_wq]
root         7     2  0 Aug18 ?        00:00:09 [ksoftirqd/0]
root         8     2  0 Aug18 ?        00:00:06 [rcu_sched]
root         9     2  0 Aug18 ?        00:00:00 [rcu_bh]
root        10     2  0 Aug18 ?        00:00:00 [migration/0]
root        11     2  0 Aug18 ?        00:00:00 [watchdog/0]
[...]

Opțiunile -f și -F afișează și alte atribute ale procesului, precum:

  • UID: numele utilizatorului care deține procesul
  • PPID: identificatorul procesului părinte
  • C: procentul de procesor ocupat
  • STIME: timpul de pornire (start time)
  • RSS: memoria RAM ocupată (resident set size)

Astfel de atribute sunt utile pentru a vedea care sunt procesele cele mai consumatoare de resurse (de exemplu procesor sau memorie).

Monitorizarea proceselor

Monitorizarea folosind htop

Utilitarul htop este un utilitar de monitorizare a proceselor în lumea Linux. Este echivalent Task Manager din Windows. Monitorizarea proceselor este o activitate foarte importantă în administrarea unui sistem de calcul. Un proces care, intenționat sau nu, consumă abuziv resursele sistemului va duce la o proastă funcționare sau chiar la blocarea sistemului. De aceea, utilitarele de monitorizare a sistemului (și a proceselor) sunt diverse. Amintim:

  • iotop: utilitar pentru monitorizarea consumului de I/O al proceselor
  • sysstat: o suită de utilitare pentru monitorizarea sistemului (procese, memorie, I/O, rețea)

Utilitarul htop rulează în linia de comandă prin introducerea comenzii htop și pornește, în terminal, o fereastră interactivă, ca în imaginea de mai jos:

Utilitarul htop

htop este, de asemenea, un utilitar interactiv, un sumar al comenzilor ce pot fi folosite fiind prezentat în bara de jos a ferestrei sale. De exemplu, așa cum vedem și în imaginea de mai sus, cu ajutorul tastei F6 putem alege un atribut după care să sortăm procesele.

Oprirea proceselor. Semnale

Odată pornit, un proces rulează și consumă resursele sistemului. După ce execută codul din executabilul corespunzător, procesul își încheie execuția și eliberează resursele consumate. Dar anumite programe (de exemplu serverele) nu au un punct de oprire, ci rulează într-o buclă, teoretic la infinit. La fel, anumite programe (de exemplu un browser web) sunt interactive și își încheie execuția doar la acțiunea explicită a utilizatorului.

Deosebim astfel între următoarele tipuri de oprire a unui proces:

  1. Procesul ajunge la sfârșitul codului programului și își încheie execuția.
  2. Un comportament neașteptat sau o eroare în funcționarea programului cauzează încheierea execuției acestuia (crash).
  3. Utilizatorul execută o acțiune interactivă care trimite comanda de încheiere a execuției procesului: de exemplu folosirea tastei q pentru a încheia un proces top sau folosirea butonului x dintr-o aplicație grafică pentru a încheia execuția acesteia.
  4. Utilizatorul sau sistemul de operare decide că un proces nu rulează corespunzător și decide terminarea acestuia.

Ultimul punct din pasul de mai sus, numit și terminarea unui proces (sau, informal, omorârea unui proces) este realizat, în Linux, prin folosirea semnalelor.

Folosirea semnalelor pentru omorârea proceselor

Ca să terminăm forțat (omorâm) un proces folosim semnale. Un semnal este o notificare trimisă de utilizator sau de sistemul de operare către un proces. Nu este obligatoriu ca un semnal să omoare procesul care îl primește, dar este cel mai des întâlnit comportament, și principala utilizare a semnalelor.

Ca să trimitem un semnal unui proces trebuie să știm PID-ul acestuia și folosim utilitarul kill urmat de PID-ul procesului. Se folosesc mai multe terminale in paralel. Adică, dacă pornim într-un terminal un proces sleep folosind comanda de mai jos:

student@uso:~$ sleep 60

în alt terminal vom afla PID-ul său (folosind pidof):

student@uso:~$ pidof sleep
9486

și apoi îl vom omorî (folosind kill):

student@uso:~$ kill 9486

Comanda kill primește ca argument PID-ul procesului de omorât, adică 9486.

Verificăm din nou dacă există un proces sleep folosind pidof:

student@uso:~$ pidof sleep
student@uso:~$

Vedem din output că nu mai există procesul sleep, deci a fost omorât.

În terminalul inițial, în care am rulat comanda sleep, apare un mesaj care indică omorârea procesului:

student@uso:~$ sleep 60
Terminated
Folosirea semnalului SIGKILL

În anumite situații, folosirea utilitarului kill nu duce la omorârea procesului țintă. În această situație, vom transmite procesului țintă semnalul SIGKILL care este garantat că va omorî procesul. Adică, amuzant spus, SIGKILL este o bombă nucleară, un glonț care trece prin vesta anti-glonț, cianură de potasiu. Astfel, dacă pornim pe un terminal un proces sleep la fel ca mai sus, în alt terminal vom omorî procesul folosind semnalul SIGKILL ca mai jos:

student@uso:~$ pidof sleep
9834
student@uso:~$ kill -KILL 9834
student@uso:~$ pidof sleep
student@uso:~$

Secvența de comenzi este similară secvenței anterioare cu excepția folosirii opțiunii -KILL la comanda kill care înseamnă trimiterea semnalului SIGKILL.

Efectul este similar dar, pe terminalul în care am rulat comanda sleep, apare un mesaj de forma:

student@uso:~$ sleep 60
Killed

Mesajul Killed este afișat atunci când un proces primește semnalul SIGKILL.

Exerciții: Oprirea proceselor

  • Porniți în trei terminale diferite trei procese sleep. Omorâți-le pe toate cu o singură comandă. PID-ul shellului curent poate fi aflat folosind comanda:
student@uso:~$ echo $$
9477
  • Omorâți shellul curent.
  • Porniți o aplicație vim. Porniți o aplicație htop. Porniți o aplicație firefox. Omorâți aceste procese folosind utilitarul kill intr-o singura comanda.

Observati cum firefox a pornit multiple procese pentru o singura pagina. (Firefox folosește o caracteristică numită multiprocesare; În loc să ruleze totul într-un singur proces, diferite componente ale browserului sunt impartite in procese separate).

Exercițiu: Proces abuziv

Creați un fișier cpu_hog cu următorul conținut:

#!/bin/bash
 
(
nohup dd if=/dev/zero of=/dev/null bs=8M > /dev/null 2>&1 &
)

Folosiți scriptul cpu_hog pentru a porni un proces care consumă mult procesor. Îl porniți folosind o comandă de forma:

$ chmod +x cpu_hog
$ ./cpu_hog

Scriptul cpu_hog pornește un proces care execută o buclă infinită.

Observați, cu ajutorul comenzii htop, că procesorul este încărcat. Identificați procesul cel mai consumator de resurse și omorâți-l (uitati-va dupa comanda care a declansat procesul). Observați, tot cu ajutorul comenzii htop, că acum procesorul nu mai este încărcat.

Dăm chmod +x cpu_hog pentru a putea executa scriptul cpu_hog. NU trebuie să o dăm de fiecare dată când rulăm scriptul, o dată este suficient.

Instalarea și dezinstalarea aplicațiilor

Instalarea unui sistem de operare duce la instalarea unui set de bază de aplicații pe acel sistem. Acest set este minimal; dacă dorim funcționalități peste acest set, instalăm noi aplicații. Instalarea unei aplicații duce la adăugarea în sistem a unui fișier executabil (sau mai multe) pentru rularea aplicației și eventuale fișiere de configurare, de documentare și de stocare a datelor aplicației. Instalarea unei aplicații presupune obținerea unui fișier specializat numit pachet software și apoi despachetarea acestuia în fișierele specifice aplicației. Un pachet este efectiv o arhivă cu fișierele specifice aplicației. După instalarea aplicației / pachetului, aceasta poate fi pornită și rulată de utilizator pentru nevoile sale.

Instalarea unei aplicații dintr-un pachet software este prezentată schematic mai jos:

De partea cealaltă, dezinstalarea unei aplicații / unui pachet înseamnă ștergerea din sistem a fișierelor specifice. După dezinstalarea aplicației, aceasta nu mai poate fi pornită, nemaiexistând fișierul executabil corespunzător sau celelalte fișiere specifice.

Acțiunile de instalare, dezinstalare și configurare a pachetelor într-un sistem sunt numite colectiv gestiunea pachetelor (software) ((software) package management).

În Linux, aplicațiile sunt, în general, instalate prin intermediul unei aplicații dedicate numite manager de pachete (software) ((software) package manager sau (software) package management system). În distribuțiile Linux bazate pe Debian / Ubuntu, managerul de pachete oferă utilitarele apt și dpkg (și altele) și aplicații precum Synaptic. În distribuțiile Linux bazate pe RedHat / Fedora, managerul de pachete oferă utilitarele yum sau dnf sau rpm (și altele) precum PackageKit.

Mașina virtuală de suport folosește o distribuție Ubuntu. De aceea ne vom concentra doar pe distribuțiile bazate pe Debian / Ubuntu și deci, pe utilitarele apt și dpkg.

Instalarea unei aplicații cunoscute

Cel mai adesea, dorim rapid să avem o aplicație care să ne rezolve o nevoie. Să presupunem că avem nevoia să lucrăm cu fișiere în format SVG (Scalable Vector Graphics). Pentru aceasta vom instala aplicația Inkscape.

Instalarea din linia de comandă

În linia de comandă, folosim utilitarul apt pentru a instala pachetul inkscape:

student@uso:~$ sudo apt update
[sudo] password for student:
Hit:1 http://ro.archive.ubuntu.com/ubuntu bionic InRelease
[...]
 
student@uso:~$ sudo apt install inkscape
[...]

Comanda sudo apt update actualizează informațiile despre pachete; vom clarifica mai jos rolul său, inclusiv de ce este recomandată rularea sa (fără a fi obligatorie). Comanda sudo apt install inkscape instalează efectiv pachetul numit inkscape, care va instala aplicația Inkscape. Instalarea pachetelor în sistem este o acțiune privilegiată, care necesită permisiuni administrative. Din acest motiv cele două comenzi de mai sus sunt prefixate de comanda sudo.

În acest moment, aplicația Inkscape este instalată și poate fi pornită.

Exercițiu: Porniți aplicația Inkscape în toate modurile descrise în secțiunea Pornirea și oprirea aplicațiilor grafice.

Instalarea de noi aplicații

Instalarea VLC

Avem nevoie de un player video și știm că VLC este unul dintre cele mai folosite playere. Pentru a îl folosi pe sistem, instalăm pachetul vlc:

student@uso:~$ sudo apt install vlc
[sudo] password for student:
[...]
Do you want to continue? [Y/n] Y
[...]

Acum aplicația VLC este disponibilă în sistem.

Exercițiu: Porniți aplicația VLC în modurile descrise în Pornirea și oprirea aplicațiilor grafice.

Mai sus nu am mai rulat comanda sudo apt update pentru că sistemul este deja actualizat de la instalarea pachetului inkscape.

Instalarea Glances

Pentru a monitoriza sistemul și procesele sistemului putem folosi utilitarele top sau htop. Utilitarul Glances rulează tot în linia de comandă și oferă o interfață mai complexă a sistemului, utilă mai ales pentru administratorii de sisteme. Instalăm pachetul glances:

student@uso:~$ sudo apt install glances
[...]
Do you want to continue? [Y/n] Y
[...]

Exercițiu: Porniți utilitarul în linia de comandă folosind comanda glances. Ieșirea din utilitar se face, la fel ca în cazul top și htop, folosind tasta q.

Exerciții de instalare de aplicații

Instalați și porniți următoarele pachete:

  • gimp: pachet care instalează aplicația Gimp (cu interfață grafică), un editor de imagini
  • neofetch: pachet care instalează utilitarul neofetch (în linia de comandă), care afișează un sumar informativ despre sistem
  • audacity: pachet care instalează aplicația Audacity (cu interfață grafică), un editor audio

Puteți realiza instalarea din interfața grafică a managerului de pachete sau din interfața în linia de comandă.

Identificarea unei aplicații de instalat

În exemplele și exercițiile de mai sus am știut ce aplicație dorim să folosim și am instalat pachetul corespunzător. Numele pachetului este cel mai adesea același cu numele aplicației.

În anumite situații, însă, vom ști doar ce nevoie avem dar nu și ce aplicație să instalăm. Adică vom avea nevoi precum:

  • Vreau să aflu care este viteza conexiunii mele la Internet.
  • Vreau să gestionez mai bine documentele PDF și cărțile format electronic (e-book).
  • Vreau să descarc un video de pe YouTube.
  • Vreau să fac un tutorial video: să creez o filmare în care să înregistrez ecranul laptopului meu.
  • Vreau să editez un fișier PDF ca să pot adăuga o semnătură simplă.

Pentru aceste nevoi vrem să căutăm o aplicație potrivită, să o instalăm și să o folosim.

Este important să ne gândim la nevoie (la obiectiv, la finalitate) nu la aplicație (la mijloc). O nevoie poate fi rezolvată în mai multe moduri și cu mai multe aplicații și trebuie să alegem ce ni se pare mai potrivit. Poate nu este nevoie de o aplicație instalată, poate există un site / aplicație web sau un plugin de browser suficient. Sau poate există o aplicație pe telefonul mobil care poate fi folosită rapid și ușor.

Căutarea unei aplicații cu managerul de pachete

Căutarea unei aplicații cu managerul de pachete este utilă atât pentru a căuta un pachet potrivit unei nevoi, cât și pentru a identifica ce pachet corespunde unei aplicații de care știm. De exemplu o aplicație descoperită prin Internet.

Față de căutarea în Internet, căutarea în managerul de pachete este avantajoasă pentru că va căuta doar în pachetele disponibile și instalabile în sistem cu ajutorul managerului de pachete. Este dezavantajoasă pentru că șirul de căutare nu este la fel de flexibil: în general se căută fix acel șir sau acea expresie (keyword). Există astfel un risc să nu localizăm cea mai potrivită aplicație pentru nevoia noastră, dacă folosim un șir nepotrivit.

Căutarea folosind linia de comandă

În linia de comandă putem folosi șirul de căutare ca argument pentru comanda apt search:

student@uso:~$ apt search e-book
Sorting... Done
Full Text Search... Done
calibre/bionic,bionic 3.21.0+dfsg-1build1 all
  powerful and easy to use e-book manager
[...]
fbreader/bionic 0.12.10dfsg2-2 amd64
  e-book reader
[...]

În rezultatul comenzii de mai sus7) apar aplicațiile care au legătură cu șirul e-book, printre care și Calibre, aplicație pe care am descoperit-o și folosind căutarea în Internet și interfața grafică.

Putem folosi șirul de căutare e-book manager pentru a simplifica rezultatele obținute:

student@uso:~$ apt search e-book manager
Sorting... Done
Full Text Search... Done
calibre/bionic,bionic 3.21.0+dfsg-1build1 all
  powerful and easy to use e-book manager
 
calibre-bin/bionic 3.21.0+dfsg-1build1 amd64
  powerful and easy to use e-book manager

Exerciții de căutare și instalare

Căutați aplicațiile potrivite pentru următoarele nevoi:

  • Vreau să editez un fișier video.
  • Vreau să-mi organizez sarcinile / taskurile.
  • Vreau să-mi organizez rețetele de mâncare.

Folosiți atât căutarea în Internet, cât și căutarea folosind managerul de pachete (interfața grafică și/sau în linia de comandă).

Instalați, porniți și folosiți aplicațiile găsite.

Exercițiu: Căutarea și instalarea unei aplicații pentru o nevoie proprie

Gândiți-vă la nevoi pe care le aveți și căutați aplicații corespunzătoare pentru acele nevoi. Instalați, porniți și folosiți aplicațiile găsite.

Găsiți pe Internet liste de aplicații recomandate să fie instalate și folosite. De exemplu https://itsfoss.com/essential-linux-applications/ conține o listă de aplicații considerate esențiale în Linux. Iar https://github.com/agarrharr/awesome-cli-apps conține o listă extinsă de aplicații utile în linia de comandă.

Dezinstalarea aplicațiilor

Dacă nu mai folosim o aplicație și dorim să eliberăm spațiul ocupat pe disc, putem opta pentru a dezinstala o aplicație. Dezinstalarea înseamnă că toate fișierele corespunzătoare aplicației vor fi șterse de pe disc.

Acțiunea de dezinstalare este mai rară. Beneficiul principal al dezinstalării este eliberarea spațiului ocupat pe disc de fișiere corespunzătoare aplicației. Dar pentru că spațiul pe disc este suficient, apelăm mai rar la această acțiune.

La fel ca în cazul instalării, o aplicație poate fi instalată sau dezinstalată din interfața grafică a managerului de pachete sau din cea în linia de comandă. Dezinstalarea poate fi făcută din interfața în linia de comandă chiar dacă aplicația a fost instalată din interfața grafică și invers.

La fel ca în cazul instalării, acțiunea de dezinstalare este privilegiată.

Dezinstalarea din linia de comandă

Dezinstalarea din linia de comandă se face cu o comandă precum:

student@uso:~$ sudo apt remove neofetch
[sudo] password for student:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
  neofetch
0 upgraded, 0 newly installed, 1 to remove and 311 not upgraded.
After this operation, 365 kB disk space will be freed.
Do you want to continue? [Y/n] Y
(Reading database ... 199030 files and directories currently installed.)
Removing neofetch (3.4.0-1) ...
Processing triggers for man-db (2.8.3-2) ...

În comanda de mai sus, am dezinstalat pachetul neofetch. Comanda de dezinstalare (apt remove) a fost prefixată de comanda sudo pentru că este vorba de o acțiune privilegiată. La dezinstalare se cere confirmarea că dorim dezinstalarea pachetului.

În urma acestei acțiuni, fișierele corespunzătoare pachetului neofetch au fost șterse, incluzând fișierul executabil corespunzător. Acum nu mai avem acces la utilitar și comanda neofetch va eșua.

Comanda apt remove șterge fișierele corespunzătoare pachetului, dar lasă anumite fișiere de configurare modificate de utilizator. Aceasta pentru a permite ca o instalare ulterioară să refolosească vechea configurare. Dacă dorim ștergerea inclusiv a fișierelor de configurare modificate, folosim comanda:

student@uso:~$ sudo apt purge neofetch
[sudo] password for student:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
  neofetch*
0 upgraded, 0 newly installed, 1 to remove and 311 not upgraded.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] Y
(Reading database ... 198873 files and directories currently installed.)
Purging configuration files for neofetch (3.4.0-1) ...

Comanda de mai sus a șters fișierele de configurare pentru pachetul neofetch. Comanda apt purge poate fi folosită pentru a dezinstala pachete instalate, sau pentru a “curăța” (purge) pachete care au fost dezinstalate dar care mai au fișiere de configurare.

Exerciții de dezinstalare

Dezinstalați două dintre pachetele pe care le-ați instalat mai sus. Dezinstalați primul pachet folosind interfața grafică a managerului de pachete. Dezinstalați al doilea pachet folosind interfața în linia de comandă a managerului de pachete.

Actualizarea aplicațiilor

O aplicație este, în general, dezvoltată în continuu. Dezvoltatorii aplicației adaugă noi funcționalități, sau rezolvă probleme de funcționare sau de securitate, sau fac aplicația mai robustă sau mai eficientă8).

La fel ca în cazul instalării și dezinstalării, actualizarea aplicațiilor duce la modificarea fișierelor din sistem, deci este o acțiune privilegiată.

Actualizarea individuală a unei aplicații

Dacă dorim actualizarea individuală a unui pachet, putem folosi interfața grafică, navigând până la zona specifică aplicației.

Altfel, putem folosi o comandă precum:

student@uso:~$ sudo apt install inkscape
[sudo] password for student:
Reading package lists... Done
Building dependency tree
Reading state information... Done
inkscape is already the newest version (0.92.3-1).
0 upgraded, 0 newly installed, 0 to remove and 311 not upgraded.

Când comanda apt install primește ca argument un pachet deja instalat, va verifica dacă există o versiune actualizată a acestuia. În cazul de mai sus, versiunea instalată a pachetului inkscape (0.92.3-1) este cea mai nouă și nu este nevoie de actualizare.

Actualizarea tuturor aplicațiilor

Cel mai adesea, un utilizator va opta pentru actualizarea tuturor aplicațiilor sistemului, sau pe scurt, pentru actualizarea sistemului. Acest lucru se întâmplă și pentru că sistemul notifică periodic utilizatorul de prezența unor versiuni noi de aplicații.

Când este cazul, utilizatorul poate folosi interfața grafică sau sau cea în linia de comandă a managerului de pachete pentru actualizarea sistemului. De obicei, utilizatorul va folosi interfața grafică în momentul primirii unei notificări.

Pentru actualizarea sistemului din interfața în linia de comandă, vom folosi o comandă precum:

student@uso:~$ sudo apt update
[...]
student@uso:~$ sudo apt upgrade
[...]
311 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/301 MB of archives.
After this operation, 100 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
[...]

Folosind comanda apt upgrade actualizăm toate aplicațiile în sistem9). Este recomandat să actualizăm informațiile interne despre pachetele sistemului folosind comanda apt update.

Bune practici și greșeli comune

Acțiuni neinteractive

Atunci când instalăm, dezinstalăm sau actualizăm pachete în linia de comandă, utilitarul apt solicită confirmare pentru executarea acțiunii. Trebuie să introducem la tastatură Y (pentru Yes) sau doar să apăsăm Enter la un prompt precum cel de mai jos10):

Do you want to continue? [Y/n] Y

Această confirmare necesită intervenția utilizatorului. Utilizatorul poate opta să nu mai fie cerută confirmare; sau poate să considere adăugarea unei comenzi într-un script neinteractiv. Pentru aceasta, se poate folosi opțiunea -y la comandă ca mai jos:

student@uso:~$ sudo apt install -y neofetch
student@uso:~$ sudo apt remove -y neofetch
student@uso:~$ sudo apt upgrade -y

Folosirea opțiunii -y la oricare dintre comenzile de instalare, dezinstalare sau actualizare de pachete va duce la executarea acelei acțiuni în mod neinteractiv, fără nevoia de confirmare din partea utilizatorului.

Acțiunile de instalare, dezinstalare și actualizare de pachete pot duce la efecte nedorite precum dezinstalarea unei aplicații existente sau instalarea unui număr prea mare de aplicații dependente. De aceea, opțiunea -y trebuie folosită cu grijă și evitată în momentul în care efectuăm operații critice.

Note de subsol

Exerciții: Instalarea și gestiunea aplicațiilor

Exercițiile de mai jos presupun instalarea unor aplicații. Atunci când instalați aplicații, încercați să vedeți dacă sunt prezente și să le instalați în ordine:

  1. din depozitul standard al distribuției (folosind apt)
  2. folosind Snap
  3. manual, de pe site-ul furnizorului aplicației

De avut în vedere că dificultatea instalării este sporită pentru instalarea manuală a unei aplicații, de pe site-ul furnizorului aplicației.

OBS

Instalați OBS (Open Broadcaster Software). OBS este o soluție pentru înregistrări video și streaming. Porniți OBS după instalare.

Mattermost

Instalați Mattermost. Mattermost este o alternativă open source self-hosted la Slack. Porniți Mattermost după instalare. Nu veți putea folosi Mattermost în absența unui server de Mattermost.

Dropbox

Instalați clientul Dropbox.

Ghidra

Instalați Ghidra. Porniți Ghidra după instalare.

Cuprins

1) Spre deosebire de scenariul folosirii Alt+F2, când folosim aplicații CLI în linia de comandă, mesajele vor fi vizibile. Acest lucru se întâmplă pentru că linia de comandă înseamnă existența unui terminal unde putem vizualiza mesajele.
2) Pentru anumite aplicații combinația de taste Ctrl+c poate să nu funcționeze. În acest caz putem folosi combinația de taste Ctrl+\, mai puternică. Dacă nici Ctrl+\ nu funcționează, va trebui să trimitem aplicației un semnal mai puternic care să o oprească. Vom discuta despre semnale în Oprirea proceselor. Semnale.
3) Momentul creării unui proces dintr-un fișier executabil, prin încărcarea codului și datelor fișierului executabil în memorie, se numește load-time. Rularea procesului și folosirea resurselor sistemului se numește run-time.
5) Procesul init va exista în permanență în vârful ierarhiei de procese, indiferent de faptul că se va numi systemd, init, upstart sau altfel.
6) Este impropriu să spunem “procesul bash”; corect este “un proces creat din programul / executabilul bash” sau “procesul cu PID-ul XY”. Cu toate acestea vom folosi în general expresia “procesul bash” pentru că reiese din context despre ce proces este vorba.
7) Comanda apt search nu este privilegiată (nu modifică informații critice în sistem) și nu trebuie prefixată de comanda sudo.
8) Aducerea unei aplicații la o versiune mai nouă (update sau upgrade) are plusuri și minusuri. Avantajul este că noua versiune va avea cele mai noi funcționalități și va avea rezolvate probleme vechi de configurare. Dezavantajul este că noua versiune va fi mai puțin folosită și deci mai puțin stabilă, cu posible probleme noi de funcționare. În general este recomandat ca aplicațiile sistemului să fie actualizate (up-to-date) cu versiuni care au îmbunătățiri de funcționare sau securitate (security updates). Dacă se optează pentru cea mai recentă versiune a aplicației (posibil mai puțin stabilă), trebuie cântărit beneficiul adus de noile funcționalități față de posibilele probleme de funcționare. De obicei un utilizator obișnuit va opta pentru cea mai nouă versiune, fiind interesat în primul rând de cele mai noi funcționalități. Un administrator de sistem va opta pentru versiunile mai stabile care asigură o robustețe ridicată a sistemului.
9) Comanda apt upgrade face actualizare conservatoare a sistemului. Dacă un anumit pachet ar fi dezinstalat de acțiunea de actualizare a sistemului, pachetul nu va fi atins de managerul de pachete. Dacă dorim o actualizare completă a sistemului, incluzând dezinstalarea anumitor pachete (pentru că sunt incompatibile cu alte apchete), vom folosi comanda:
student@uso:~$ sudo apt full-upgrade
10) De fapt, atunci când ni se prezintă un prompt de forma [Y/n] apăsarea tastei Enter este echivalentă cu introducerea tastei marcate cu literă mare (aici Y). Dacă, de exemplu, ar fi fost un prompt de forma [y/N], apăsarea tastei Enter era echivalentă cu introducerea tastei N.