Controllo dei processi in Linux
Linux ha molti strumenti da terminale per recuperare info sui processi di sistema.
In verità quanto scriverò vale anche per il MAC, ma in generale i MAC users non sono molto terminal oriented.
I programmi presi in considerazione sono: ps, pstree, top, free e uptime
PS
PS da una lista dei processi che sono attivi sul sistema.
Senza altri parametri il comando si limita alla shell corrente:
$ ps
PID TTY TIME CMD
6981 pts/0 00:00:00 bash
8280 pts/0 00:00:00 ps
Possiamo usare però varie opzioni, tenendo in considerazione che ps riconosce le sintassi UNIX, BSD e GNU.
Io in genere con ps uso le opzioni senza trattini davanti.
Se ci interessa sapere quali sono i nostri processi possiamo usare il parametro x:
$ ps x
PID TTY STAT TIME COMMAND
3282 ? Ssl 0:00 gnome-session
3297 ? S 0:00 /usr/bin/dbus-launch --sh-syntax --exit-with-session
3298 ? Ss 0:00 /usr/bin/dbus-daemon --fork --print-pid 7 --print-add
3306 ? S 0:00 /usr/lib/GConf/gconfd-2
3323 ? Ssl 0:00 /usr/bin/gnome-settings-daemon
3330 ? S 0:00 /usr/lib/gvfs/gvfsd
3333 ? S 0:03 metacity
3338 ? Ssl 0:00 /usr/lib/gvfs//gvfs-fuse-daemon /home/matte/.gvfs
3343 ? S 0:00 gnome-panel
3344 ? S 0:01 nautilus
3346 ? Ssl 0:00 /usr/lib/bonobo/bonobo-activation-server --ac-activat
3348 ? S 0:01 nm-applet --sm-disable
3350 ? S 0:00 gnome-power-manager
3351 ? S 0:00 /usr/lib/gnome-disk-utility/gdu-notification-daemon
3352 ? S 0:00 /usr/lib/polkit-gnome/polkit-gnome-authentication-age
3358 ? Sl 0:13 python /usr/lib/linuxmint/mintMenu/mintMenu.py --oaf-
3362 ? Ss 0:00 gnome-screensaver
3366 ? S 0:01 /usr/lib/gnome-panel/wnck-applet --oaf-activate-iid=O
3368 ? S 0:00 /usr/lib/gnome-panel/clock-applet --oaf-activate-iid=
3369 ? S 0:00 /usr/lib/gnome-panel/notification-area-applet --oaf-a
3370 ? S 0:00 /usr/lib/notification-daemon-1.0/notification-daemon
3380 ? S 0:00 /usr/lib/gvfs/gvfsd-trash --spawner :1.5 /org/gtk/gvf
3382 ? Sl 0:00 /usr/bin/gnome-keyring-daemon --start --foreground --
3389 ? S 0:00 /usr/lib/gvfs/gvfs-gdu-volume-monitor
3395 ? S 0:00 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
6978 ? Rl 0:02 gnome-terminal
6979 ? S 0:00 gnome-pty-helper
6981 pts/0 Ss 0:00 bash
8282 pts/0 R+ 0:00 ps x
9526 ? Sl 1:22 firefox
Dove:
- PID (Process Identifier) è il numero del processo
- TTY è terminale/console dove gira il processo; il ? indica che non gira nel terminale
- STAT è lo status del processo, e può essere S (sleeping), R (running), D (dead) o Z (zombie)
- TIME
- COMMAND è il comando completo
Altre opzioni interessanti sono:
- l che da info su PPID (parent PID) e UID (user identification)
- u che mostra il proprietario del processo e i cicli di cpu
- a che mostra una lista dei processi di tutti
- f mostra i processi in maniera gerarchica in immagine ASCII
PSTREE
Con pstree possiamo vedere i processi in maniera gerarchica.
I processi infatti non sono mai isolati, ma dipendono da altri processi.
Al top troviamo init 1; init è il primo processo che Linux lancia all'avvio.
$ pstree
init─┬─NetworkManager─┬─dhcpcd
│ └─{NetworkManager}
├─SystemToolsBack
├─6*[agetty]
├─bonobo-activati───{bonobo-activat}
├─clock-applet
├─console-kit-dae───63*[{console-kit-da}]
├─crond
├─2*[dbus-daemon]
├─dbus-launch
├─devkit-disks-da───devkit-disks-da
├─devkit-power-da
├─gconfd-2
├─gdm-binary───gdm-simple-slav─┬─Xorg
│ └─gdm-session-wor───gnome-session─┬─gdu-not+
│ ├─gnome-p+
│ ├─gnome-p+
│ ├─metacit+
│ ├─nautilu+
│ ├─nm-appl+
│ ├─polkit-+
│ └─{gnome-+
├─gnome-keyring-d───2*[{gnome-keyring-}]
├─gnome-screensav
├─gnome-settings-───{gnome-settings}
├─gvfs-fuse-daemo───3*[{gvfs-fuse-daem}]
├─gvfs-gdu-volume
├─gvfs-gphoto2-vo
├─gvfsd
├─gvfsd-trash
├─hald───hald-runner─┬─hald-addon-acpi
│ ├─hald-addon-gene
│ ├─hald-addon-inpu
│ ├─hald-addon-leds
│ └─hald-addon-rfki
├─mintmenu─┬─firefox───9*[{firefox}]
│ ├─gnome-terminal─┬─bash───pstree
│ │ ├─gnome-pty-helpe
│ │ └─{gnome-terminal}
│ └─{mintmenu}
├─modem-manager
├─notification-ar
├─notification-da
├─polkitd
├─syslog-ng───syslog-ng
├─system-tools-ba
├─udevd───2*[udevd]
├─wnck-applet
└─wpa_supplicant
Alcune opzioni interessanti sono:
- a mostra i parametri con i quali vengono eseguiti i processi
- h distingue tra i nostri processi e gli ancestors (tipo init)
- p mostra il PID
- u mostra l'user
TOP
Questo comando, al contrario di ps, è dinamico, nel senso che non da uno "scatto" di com'è lo stato ma si aggiorna di continuo.
Top ci da molte info sul sistema e sui processi attivi.
Le prime righe ci da info sul tempo, sull'uptime, il numero di processi, lo status e info su memoria, swap e cpu.
Cliccando su F possiamo dire a top cosa vogliamo vedere di preciso.
Inoltre, come forse avete capito, top è interattivo; ad esempio cliccando su H vedrete l'online help; cliccando su U seguito dallo username vederete i processi di quell'utente; Shift+R inverte l'output; Q esce da top; Shift+Z serve per aggiungere i colori; ecc.
Per top se volete potete trovare anche delle gui come gtop (scritto in gtk) e htop (che è grafico per modo di dire).
FREE
Questo comando serve per vedere la RAM occupata/libera.
Usate lo switch -m per vedere le misure in megabyte.
$ free -m
total used free shared buffers cached
Mem: 2024 1910 113 0 145 1380
-/+ buffers/cache: 385 1639
Swap: 1019 0 1019
Free è molto affidabile in quanto legge i dati esposti dal kernel in /proc/meminfo.
Con l'opzione -t potete vedere anche i totali.
Da tenere presente la voce used è formata da quella usata dai processi+buffer+cached.
UPTIME
In genere questo comando è usato per vedere da quanto tempo il pc è in esecuzione.
L'output addizionale mostra il tempo corrente, quanti users sono loggati e il carico di sistema.
$ uptime
11:50:21 up 2 days, 1:03, 2 users, load average: 0.11, 0.11, 0.17
KILL
Al contrario di quello che può sembrare dal nome, kill serve "solo" per mandare messaggi segnali ai processi.
Per usare alcuni segnali bisogna essere root.
Con kill -l possiamo vedere la lista di tutti i segnali che possiamo inviare.
I più usati sono:
- SIGHUP dice al processo di fare un restart immediatamente dopo essersi terminato
- SIGTERM è una richiesta di clean up
- SIGKILL forza un processo a terminarsi
- SIGSTOP interrompe un processo fino a che non invii il segnale SIGCONT di continuare
Per mandare un segnale si può sia scrivere il nome del segnale che il numero (che puoi trovare attraverso kill -l) seguito dall'ID del processo che ci interessa:
# kill -19 9201 è uguale a
# kill SIGSTOP 9201
Per trovare l'ID esatto possiamo usare ps come descritto prima, magari con l'aiuto di grep:
$ ps aux | grep ssh
KILLER COMMAND
Il comando killall supporta gli stessi segnali di kill, ma al posto dell'ID serve il nome del processo.
Senza spcificare il segnale killall usa il -15 (-TERM).
Ad esempio:
# killall -15 bash
terminerà tutte le istanze di bash, inclusa la shell usata per inviare il comando.
Quindi attenzione a come si usa killall.
Possiamo anche attivare la modalità interattiva tramite killall -i.
BACKGROUND & FOREGROUND
Alcune volte lanciamo programmi da terminale che poi useremo a lungo; e in più i programmi grafici bloccano la shell.
In questi casi possiamo mettere tali programmi in background, sia dall'inizio che in un secodno momento.
Per metterlo in background all'avvio aggiungiamo il simbolo & alla fine del comando:
$ gimp &
[1] 4507
Sotto il comando viene mostrato l'ID e poi la bash è in grado di accettare altri comandi.
Attraverso il comando jobs possiamo vedere che jobs sono attivi nella shell corrente.
Il job Id è utile anche quando vogliamo muovere un programma in background attraverso Ctrl+Z:
^Z
[3]+ Stopped gimp
Se adesso scriviamo bg il processo continuerà in background.
NOHUP
Attraverso nohup facciamo in modo che il processo continui anche dop la chisura della shell:
$ nohup sleep 2000 &
[5] 4487
nohup: ignoring input and appending output to 'nohup.out'
PGREP
Con questo comando velociziamo la ricerca dei processi.
Infatti basta usare pgrep nome_comando
$ pregp ssh
1451
1720
4570
per trovare tutti gli ID di quel processo.
linux ps pstree top free uptime kernel proc
Commentami!