Comanda strace
(system call trace) ne este utilă pentru a investiga ce apeluri de sistem efectuează o comandă dată și ce parametri folosește.
De exemplu, dacă dorim să urmărim apelurile de sistem efectuate de comanda ls
folosim comanda
strace ls
Output-ul fiind destul de vast, ne preocupă să obținem doar informații despre fișierele deschide. Pentru aceasta folosim opțiunea -e
a comenzii strace
cu ajutorul căreia filtrăm tipuri de operații. În cazul de față folosim comanda
strace -e file ls
Observăm fișierele deschise.
Pentru a vedea diferența între comenzile ls
și ls -l
folosim comanda
strace -e file ls -l
Observăm că acum deschise și fișiere precum /etc/passwd
și /etc/group
pentru a determina username-ul și grupul aferent UID-ului și GID-ului din fișier.
Comanda
netstat -s
afișează informații statistice despre pachetele sistemului. Ne interesează să știm de unde obține comanda respectivă informațiile.
Rulați comanda
strace -e open netstat -s
pentru a afla ce fișiere deschide comanda la rulare.
Care fișier este citit pentru a afla informații despre pachetele primite (packets received)? Vizualizați acel fișier (luați-o pe încercate).
strace
permite investigarea unui proces aflat deja în rulare. Numim acest lucru atașarea la un proces. Putem astfel investiga apelurile de sistem efectuate de un proces aflat în rulare și diagnostica anumite probleme ale acestuia. Pentru a ne putea atașa la un proces avem nevoie de PID-ul acestuia.
Deschideți două tab-uri de terminal (adică să aveți două deschise; dacă aveți deja unul mai deschideți încă unul).
Ctrl+Shift+t
.
Într-unul dintre tab-uri aflați PID-ul procesului curent (a shell-ului) folosind comanda
echo $$
Pentru a investiga shell-ul, din celălalt tab folosim comanda
strace -p <PID>
unde <PID>
este PID-ul shell-ului determinat mai sus.
Acum dacă în celălalt shell rulăm comenzi vom vedea ce se întâmplă în cadrul shell-ului.
Observăm că se folosește apelul de sistem clone
pentru a crea un nou proces, dar nu apare apelul de sistem execve
care înlocuiește imaginea de proces. Pentru a vedea aceste apeluri de sistem trebuie să precizăm comenzii strace
să investigheze și procesele copil folosind opțiunea -f
(de la follow children
). Astfel, vom putea investiga folosind comanda
strace -f -p <PID>
Dacă dorim să vedem doar operațiile cu procese și fișiere, de exemplu, vom folosi pentru investigație comanda
strace -f -e process,file -p <PID>
Sunt cazuri în care dorim să pornim procese detașate de terminal. Adică după pornirea procesului să închidem terminalul și procesul să nu fie “omorât” ci să își încheie execuția. Aceste procese sunt echivalente unor procese daemon.
Pentru a detașa un proces de un terminal se folosesc comenzi precum nohup
, dtach
și disown
.
Folosiți comanda wget
pentru a descărca fișierul .torrent
de aici.
Porniți un proces BitTorrent
folosind comanda:
btdownloadheadless lin-prog.torrent
btdownloadheadless
instalat pe sistem instalați pachetul bittorrent
sudo apt-get install bittorrent
sau pachetul bittornado
sudo apt-get install bittornado
Transferați procesul pornit în starea de rulare în background. Detașați procesul de terminal folosind comanda disown
. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda lsof
pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error.
Apoi încheiați execuția acelui proces.
Folosiți comanda nohup
pentru a crea un proces BitTorrent precum cel de mai sus, detașat de terminal. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda lsof
pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error.
Trimiteți un semnal procesului pentru a-i încheia execuția și apoi reporniți-l sub nohup
astfel încât ieșirea standard (standard output, stdout) să fie redirectată la /dev/null
iar ieșirea de eroare standard (standard error, stderr) să fie redirectată în fișierul err.log
. Investigați cu lsof
unde pointează descriptorii standard ai procesului.
Pentru a vedea configurația cron
a sistemului inspectăm configurațiile din fișierele/directoarele /etc/cron*
. Fișierele /etc/cron.d/*
și fișierul /etc/crontab
conțin configurații standard cron
la nivelul sistemului. Liniile de configurare urmează sintaxa crontab așa cum este exemplificată aici.
Pentru a vedea configurația pentru utilizatorul curent folosim comanda
crontab -l
Dacă suntem autentificați ca utilizator privilegiat, putem vizualiza configurația cron
pentru un utilizator dat putem folosi comanda
crontab -u <username> -l
unde <username>
este numele utilizatorului a cărui configurație dorim să o afișăm.
Pentru a afla job-urile cron active per utilizator putem inspecta, ca utilizator privilegiat, directorul de spooling /var/spool/cron/
sudo tree /var/spool/cron/
În subdirectorul /var/spool/cron/crontabs/
se găsesc job-urile cron active (marcate per utilizator).
Dacă dorim să avem un job care să ruleze periodic vom crea o intrare în crontab-ul utilizatorului root
.
Următorul exercițiu este didactic, ca să putem urmări comportamentul cron
.
Comanda de mai jos este folosită pentru a afișa numărul de procese și thread-uri curente la nivelul sistemului:
/bin/echo "Num processes: $(ps -e --no-header | wc -l), num threads: $(ps -eL --no-header | wc -l)"
Folosim calea completă către comanda echo
pentru că nu știm cum arată variabila PATH
în mediul în care rulează cron
.
Adăugați comanda de mai sus să ruleze la fiecare două minute prin alterarea crontab-ului utilizatorului root
. După adăugare urmăriți spool-ul cron în /var/spool/cron/crontabs/root
.
În urma funcționării corecte, veți vedea o intrare in /var/log/syslog
care arata ca a fost executata comanda.
cron
.
root
urmăriți indicațiile de aici.
Actualizați comanda din cron
de mai sus astfel încât output-ul comenzii să fie adăugat într-un fișier dat. Output-ul să conțină și data la care a fost rulată comanda.
Instalați pachetul debsums
. Urmăriți ce configurări de cron sunt adăugate la instalarea pachetului.
dpkg -L <nume-pachet>
unde <nume-pachet>
este numele pachetului.
Instalați un client de Bittorrent care funcționează în linia de comandă, precum transmission-cli
sau bittorrent
sau bittornado
și porniți-l în background (folosind nohup
) ca să descarce un anumit conținut Bittorrent. Găsiți un fișier .torrrent
pe Internet și descărcați-l.
Apoi creați un script care să verifice dacă este pornit clientul Bittorrent pentru acel fișier .torrent
și dacă nu este pornit să-l repornească.
Plasați script-ul în crontab cu verificare la 10 minute.
Folosiți supervisord pentru a porni și gestiona clientul BitTorrent de mai sus.
Pentru a verifica funcționarea NTP (Network Time Protocol) o soluție este instalarea utilitarului ntpdate
. Dacă nu-l aveți instalat, instalați-l folosind comanda
sudo apt-get install ntpdate
Aveți două utilitare pe care le puteți folosi interschimbabil pentru actualizarea timpului sistemului: ntpdate
care primește ca argument un server NTP, și nptdate-debian
care folosește serverele configurate în /etc/default/ntpdate
(directiva NTPSERVERS
).
Instalați, dacă nu este instalat serverul NTP
prin intermediul pachetului ntp
. Serverul va porni automat și veți putea verifica faptul că ascultă conexiuni pe portul 123
UDP folosind comanda
sudo netstat -ulpn
Discutați cu 2-3 colegi și aflați adrese IP stațiilor pe care aceștia lucrează și adăugați configurare pentru serverul NTP în fișierul /etc/ntp.conf
. După un timp se va crea un mesh de comunicare între serverele NTP din sala de laborator.
ntpq -p ntpq -pn
Pe mașina virtulă verificați dacă daemonul de syslog este instalat (Hint: rsyslog).
root@heimdall:~# apt-get install rsyslog Reading package lists... Done Building dependency tree Reading state information... Done rsyslog is already the newest version. 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Adaugati în /etc/rsyslog.conf
o intrare prin care TOATE mesajele din sistem sa fie înregistrate în /var/log/all_logs
root@heimdall:~# tail -n 1 /etc/rsyslog.conf *.* -/var/log/all_logs Se adauga un minus (-) pentru a se evita sincronizarea fisierului dupa fiecare mesaj syslog (fiind vorba despre toate mesajele din sistem).
Creati fisierul /var/log/all_logs
, apoi configurati owner-ul ca fiind user-ul sub care ruleaza rsyslog
:
# touch /var/log/all_logs # chown syslog:adm /var/log/all_logs
Reporniți daemonul rsyslog
și verificați conținutul fișierului /var/log/all_logs
.
root@heimdall:~# /etc/init.d/rsyslog restart Stopping enhanced syslogd: rsyslogd. Starting enhanced syslogd: rsyslogd. root@heimdall:~# tail /var/log/all_logs Nov 9 15:34:04 heimdall kernel: imklog 5.8.5, log source = /proc/kmsg started. Nov 9 15:34:04 heimdall rsyslogd: [origin software="rsyslogd" swVersion="5.8.5" x-pid="2604" x-info="http://www.rsyslog.com"] start
Folosind comanda logger
, generați 5 mesaje de log cu facilitatea mail și cu proritatea info, care să conțină textele “mail log 1” … “mail log 5”. Verificați prezența mesajelor în /var/log/all_logs
.
root@heimdall:~# logger -p mail.info "mail log 1" root@heimdall:~# logger -p mail.info "mail log 2" root@heimdall:~# logger -p mail.info "mail log 3" root@heimdall:~# logger -p mail.info "mail log 4" root@heimdall:~# logger -p mail.info "mail log 5" root@heimdall:~# tail /var/log/all_logs Nov 9 15:34:04 heimdall kernel: imklog 5.8.5, log source = /proc/kmsg started. Nov 9 15:34:04 heimdall rsyslogd: [origin software="rsyslogd" swVersion="5.8.5" x-pid="2604" x-info="http://www.rsyslog.com"] start Nov 9 15:36:55 heimdall root: mail log 1 Nov 9 15:36:57 heimdall root: mail log 2 Nov 9 15:36:58 heimdall root: mail log 3 Nov 9 15:36:59 heimdall root: mail log 4 Nov 9 15:37:00 heimdall root: mail log 5
Modificați /etc/logrotate.conf
astfel încat fisierul /var/log/all_logs
să fie rotit zilnic, folosind până la maxim 10 fișiere, fișire care să fie comprimate. Logurile trebuie să fie trimiste pe email la sysadmin@gsr.cs.pub.ro. (Hint: man logrotate
)
root@heimdall:~# tail -n 8 /etc/logrotate.conf /var/log/all_logs { missingok daily create 0660 root utmp compress rotate 10 mail sysadmin@gsr.cs.pub.ro }