103.5 Lezione 1
Certificazione: |
LPIC-1 |
---|---|
Versione: |
5.0 |
Argomento: |
103 Comandi GNU e Unix |
Obiettivo: |
103.5 Creare, controllare e terminare i processi |
Lezione: |
1 di 2 |
Introduzione
Ogni volta che invochiamo un comando, vengono avviati uno o più processi. Un amministratore di sistema ben addestrato non solo deve creare processi, ma anche essere in grado di tenerne traccia e inviare loro diversi tipi di segnali se e quando richiesto. In questa lezione esamineremo il controllo del lavoro e il monitoraggio dei processi.
Controllare i Job
I Job sono processi che sono stati avviati in modo interattivo tramite un terminale, inviati in background e non hanno ancora terminato l’esecuzione. Puoi scoprire i job attivi (e il loro stato) nel tuo sistema Linux eseguendo jobs
:
$ jobs
Il comando jobs
sopra non ha prodotto alcun output, il che significa che non ci sono job attivi al momento. Creiamo il nostro primo job eseguendo un comando che impiega un po' di tempo per terminare l’esecuzione (il comando sleep
con un parametro di 60
) e — durante l’esecuzione — premi Ctrl+Z:
$ sleep 60 ^Z [1]+ Stopped sleep 60
L’esecuzione del comando è stata interrotta (o — meglio — sospesa) e il prompt dei comandi è nuovamente disponibile. Puoi cercare lavori una seconda volta e troverai ora quello sospeso :
$ jobs [1]+ Stopped sleep 60
Cerchiamo di spiegare l’output:
[1]
-
Questo numero è l’ID del lavoro e può essere usato — preceduto da un simbolo di percentuale (
%
) — per cambiare lo stato del lavoro dalle utilitàfg
,bg
ekill
(come ti verrà mostrato in seguito). +
-
Il segno più indica il lavoro predefinito corrente (ovvero, l’ultimo sospeso o inviato in background). Il lavoro precedente è contrassegnato con un segno meno (
-
). Eventuali altri lavori precedenti non vengono contrassegnati. Stopped
-
Descrizione dello stato del lavoro.
sleep 60
-
Il comando o il lavoro stesso.
Con l’opzione -l
, i lavori visualizzeranno inoltre l’ID del processo (PID) subito prima dello stato:
$ jobs -l [1]+ 1114 Stopped sleep 60
Le restanti possibili opzioni di lavoro sono:
-n
-
Elenca solo i processi che hanno cambiato stato dall’ultima notifica. I possibili stati includono:
Running
,Stopped
,Terminated
oDone
. -p
-
Elenca gli ID dei processi.
-r
-
Elenca solo i lavori in esecuzione.
-s
-
Elenca solo i lavori fermati (o sospesi).
Note
|
Ricorda, un lavoro ha sia un job ID che un process ID (PID). |
Specifiche del Job
Il comando jobs
così come altre utilità come fg
, bg
e kill
(che vedrai nella prossima sezione) necessitano di una specifica del lavoro (o jobspec
) per agire su un particolare lavoro. Come abbiamo appena visto, questo può essere — e normalmente lo è — l’ID del lavoro preceduto da %
. Tuttavia, sono possibili anche altre specifiche di lavoro. Vediamole insieme:
%n
-
Job il cui numero di identificazione è
n
:$ jobs %1 [1]+ Stopped sleep 60
%str
-
Job la cui riga di comando inizia con
str
:$ jobs %sl [1]+ Stopped sleep 60
%?str
-
Job la cui riga di comando contiene
str
:$ jobs %?le [1]+ Stopped sleep 60
%+
or%%
-
Job corrente (l’ultimo avviato in background o sospeso in primo piano):
$ jobs %+ [1]+ Stopped sleep 60
%-
-
Job precedente (quello che era
%+
prima di quello predefinito, quello attuale):$ jobs %- [1]+ Stopped sleep 60
Nel nostro caso, poiché c’è un solo job, appare come sia attuale sia precedente.
Stato del Job: Sospensione, Foreground e Background
Una volta che un lavoro è in background o è stato sospeso, possiamo eseguire una delle tre operazioni seguenti:
-
Portalo in primo piano con
fg
:$ fg %1 sleep 60
fg
sposta il job specificato in primo piano e lo rende il lavoro corrente. Ora possiamo aspettare che finisca, fermarlo di nuovo con Ctrl+Z o terminarlo con Ctrl+C -
Portalo in background con
bg
:$ bg %1 [1]+ sleep 60 &
Una volta in background, il lavoro può essere riportato in primo piano con
fg
o terminato (vedi sotto). Nota la e commerciale (&
) che significa che il lavoro è stato inviato in background. È un dato di fatto, puoi anche usare la e commerciale per avviare un processo direttamente in background:$ sleep 100 & [2] 970
Insieme all’ID lavoro del nuovo lavoro (
[2]
), ora otteniamo anche il suo ID processo (970
). Ora entrambi i lavori sono in esecuzione in background:$ jobs [1]- Running sleep 60 & [2]+ Running sleep 100 &
Un po' più tardi il primo lavoro termina l’esecuzione:
$ jobs [1]- Done sleep 60 [2]+ Running sleep 100 &
-
Terminalo tramite un segnale
SIGTERM
con il comandokill
:$ kill %2
Per assicurarti che il lavoro sia stato terminato, esegui di nuovo
jobs
:$ jobs [2]+ Terminated sleep 100
Note
|
Se non viene specificato alcun lavoro, |
Distaccare i Job: nohup
I lavori che abbiamo visto nelle sezioni precedenti erano tutti allegati alla sessione dell’utente che li ha invocati. Ciò significa che se la sessione viene terminata, lo saranno anche i job. Tuttavia, è possibile scollegare i lavori dalle sessioni e farli eseguire anche dopo la chiusura della sessione. Ciò si ottiene con il comando nohup
(“no hangup”). La sintassi è la seguente:
nohup COMMAND &
Ricorda, &
invia il processo in background e libera il terminale su cui stai lavorando
Scolleghiamo il lavoro in background ping localhost
dalla sessione corrente:
$ nohup ping localhost & [1] 1251 $ nohup: ignoring input and appending output to 'nohup.out' ^C
L’output ci mostra l’ID del lavoro ([1]
) e il PID (1251
), seguito da un messaggio che ci informa del file nohup.out
. Questo è il file predefinito in cui verranno salvati stdout e stderr. Ora possiamo premere Ctrl+C per liberare il prompt dei comandi, chiudere la sessione, avviarne un’altra come root
e usare tail -f
per verificare se il comando è in esecuzione e l’output viene scritto nel file predefinito:
$ exit logout $ tail -f /home/carol/nohup.out 64 bytes from localhost (::1): icmp_seq=3 ttl=64 time=0.070 ms 64 bytes from localhost (::1): icmp_seq=4 ttl=64 time=0.068 ms 64 bytes from localhost (::1): icmp_seq=5 ttl=64 time=0.070 ms ^C
Tip
|
Invece di usare il valore predefinito |
- Se vogliamo terminare il processo, dovremmo specificare il suo PID
# kill 1251
Controllare i Processi
Un processo o un’attività è un’istanza di un programma in esecuzione. Pertanto, crei nuovi processi ogni volta che digiti comandi nel terminale.
Il comando watch
esegue periodicamente un programma (ogni due secondi per impostazione predefinita) e ci permette di osservare il cambiamento dell’output del programma nel tempo. Per esempio, possiamo monitorare come cambia la media del carico man mano che vengono eseguiti più processi digitando watch uptime
:
Every 2.0s: uptime debian: Tue Aug 20 23:31:27 2019 23:31:27 up 21 min, 1 user, load average: 0.00, 0.00, 0.00
Il comando viene eseguito finché non viene interrotto, quindi dovremmo fermarlo con Ctrl+C. Otteniamo due righe come output: la prima corrisponde a watch
e ci dice quanto spesso verrà eseguito il comando (Ogni 2.0s: uptime
), quale comando/programma guardare (uptime
) e nome host e data (debian: Tue Aug 20 23:31:27 2019
). La seconda riga di output è il tempo di attività e include il tempo (23:31:27
), quanto tempo è stato attivo il sistema (up 21 min
), il numero di utenti attivi (1 user
) e il carico di sistema medio o numero di processi in esecuzione o in attesa negli ultimi 1, 5 e 15 minuti (load average: 0.00, 0.00, 0.00
)
Allo stesso modo, puoi controllare l’uso della memoria quando vengono creati nuovi processi con watch free
:
Every 2.0s: free debian: Tue Aug 20 23:43:37 2019 23:43:37 up 24 min, 1 user, load average: 0.00, 0.00, 0.00 total used free shared buff/cache available Mem: 16274868 493984 14729396 35064 1051488 15462040 Swap: 16777212 0 16777212
Per cambiare l’intervallo di aggiornamento di watch
usa le opzioni -n
o --interval
più il numero di secondi come in:
$ watch -n 5 free
Ora il comando free
verrà eseguito ogni 5 secondi.
Per maggiori informazioni sulle opzioni di uptime
, free
e watch
, fare riferimento alle rispettive pagine di manuale.
Note
|
Le informazioni fornite da |
Inviare Segnali ai Processi: kill
Ogni singolo processo ha un identificatore di processo univoco o PID. Un modo per scoprire il PID di un processo è usare il comando pgrep
seguito dal nome del processo:
$ pgrep sleep 1201
Note
|
Un identificatore di processo può anche essere scoperto tramite il comando |
Simile a pgrep
, il comando pkill
termina un processo in base al suo nome:
$ pkill sleep [1]+ Terminated sleep 60
Per terminare più istanze dello stesso processo, è possibile utilizzare il comando killall
:
$ sleep 60 & [1] 1246 $ sleep 70 & [2] 1247 $ killall sleep [1]- Terminated sleep 60 [2]+ Terminated sleep 70
Sia pkill
che killall
funzionano in modo molto simile a kill
in quanto inviano un segnale di terminazione ai processi specificati. Se non viene fornito alcun segnale, viene inviato il valore predefinito di "SIGTERM". Tuttavia, kill
accetta solo un lavoro o un ID di processo come argomento.
I segnali possono essere specificati mediante:
-
Nome:
$ kill -SIGHUP 1247
-
Numero:
$ kill -1 1247
-
Opzione:
$ kill -s SIGHUP 1247
Per fare in modo che kill
funzioni in modo simile a pkill
o killall
(ed evitare a noi i vari comandi per trovare prima i PID) possiamo usare la sostituzione dei comandi:
$ kill -1 $(pgrep sleep)
Come dovresti già sapere, una sintassi alternativa è kill -1 `pgrep sleep`
.
Tip
|
Per un elenco esaustivo di tutti i segnali accettati da |
top
e ps
Quando si tratta di monitoraggio dei processi, due strumenti insostituibili sono top
e ps
. Mentre il primo produce output dinamicamente, il secondo lo fa staticamente. In ogni caso, entrambe sono ottime utility per avere una visione completa di tutti i processi del sistema.
Interaggire con top
Per invocare top
, digita semplicemente top
:
$ top top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14 Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie %Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 436 carol 20 0 42696 3624 3060 R 0,7 0,4 0:00.30 top 4 root 20 0 0 0 0 S 0,3 0,0 0:00.12 kworker/0:0 399 root 20 0 95204 6748 5780 S 0,3 0,7 0:00.22 sshd 1 root 20 0 56872 6596 5208 S 0,0 0,6 0:01.29 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0,0 0,0 0:00.02 ksoftirqd/0 5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kworker/u2:0 7 root 20 0 0 0 0 S 0,0 0,0 0:00.08 rcu_sched 8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0,0 0,0 0:00.00 migration/0 10 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 lru-add-drain (...)
top
consente all’utente alcune interazioni. Per impostazione predefinita, l’output viene ordinato in base alla percentuale di tempo della CPU utilizzata da ciascun processo in ordine decrescente. Questo comportamento può essere modificato premendo i seguenti tasti da dentro top
:
M
-
Ordina per utilizzo della memoria.
N
-
Ordina per numero ID processo.
T
-
Ordina per tempo di esecuzione.
P
-
Ordina per percentuale di utilizzo della CPU.
Tip
|
Per passare dall’ordine discendente a quello ascendente, basta premere |
Altre tasti interessanti per interagire con top
sono:
?
oh
-
Help.
k
-
Termina un processo.
top
chiederà qual’è ilPID
da terminare e quale segnale inviare (per impostazione predefinitaSIGTERM
o15
). r
-
Cambia la priorità di un processo (
renice
).top
ti chiederà il valorenice
. I valori possibili sono compresi tra -20 e 19, ma solo il superutente (root
) può impostarlo su un valore negativo o inferiore a quello corrente. u
-
Elenca i processi di un particolare utente (per impostazione predefinita vengono mostrati i processi di tutti gli utenti).
c
-
Mostra i percorsi assoluti dei programmi e distingue tra processi userspace e processi kernelspace (tra parentesi quadre).
V
-
Vista foresta/gerarchia dei processi.
t
em
-
Cambia l’aspetto delle letture della CPU e della memoria rispettivamente in un ciclo a quattro fasi: le prime due pressioni mostrano le barre di avanzamento, la terza nasconde la barra e la quarta la riporta indietro.
W
-
Salva le impostazioni di configurazione in
~/.toprc
.
Tip
|
Una versione più elaborata e più amichevole di |
Una spiegazione dell’output di top
L’output di top
è diviso in due aree: la summary area e la task area.
La Summary Area in top
La summary area è composta dalle cinque righe superiori e fornisce le seguenti informazioni:
-
top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14
-
current time (in formato 24-ore):
11:20:29
-
uptime (da quanto tempo il sistema è avviato e funzionante):
up 2:21
-
numero di utenti attivi e carico medio della CPU per gli ultimi 1, 5 e 15 minuti, rispettivamente:
load average: 0,11, 0,20, 0,14
-
-
Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie
(informazione riguardo i processi)-
numero totale di processi in modalità attiva:
73 total
-
running (quelli in esecuzione):
1 running
-
sleeping (quelli in attesa di riprendere l’esecuzione):
72 sleeping
-
stopped (da un segnale di controllo sul job):
0 stopped
-
zombie (quelli che hanno completato l’esecuzione ma stanno ancora aspettando che il loro processo padre li rimuova dalla tabella dei processi):
0 zombie
-
-
%Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
(percentuale del tempo di CPU impiegato)-
processi utente:
0,0 us
-
processi system/kernel:
0,4 sy
-
processi impostati tramite un valore nice — più alto è il valore, minore è la priorità:
0,0 ni
-
tempo di inattività della CPU:
99,7 id
-
processi in attesa di operazioni di I/O:
0,0 wa
-
processi che servono gli interrupt hardware — periferiche che inviano segnali al processore che richiedono attenzione:
0,0 hi
-
processi che servono gli interrupt software:
0,0 si
-
processi che servono le attività di altre macchine virtuali in un ambiente virtuale, quindi rubano tempo processore:
0,0 st
-
-
KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache
(informazioni sulla memoria in kilobyte)-
la quantità totale di memoria:
1020332 total
-
memoria inutilizzata:
909492 free
-
memoria in uso:
38796 used
-
la memoria che viene bufferizzata e memorizzata nella cache per evitare un accesso eccessivo al disco:
72044 buff/cache
Nota come
total
è la somma degli altri tre valori —free
,used
andbuff/cache
— (circa 1 GB nel nostro caso)
-
-
KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem
(informazioni sullo swap in kilobyte)-
la quantità totale di spazio di swap:
1046524 total
-
spazio di swap non utilizzato:
1046524 free
-
spazio di swap in uso:
0 used
-
la quantità di memoria di swap che può essere allocata ai processi senza causare ulteriori scambi:
873264 avail Mem
-
La Task Area in top
: Campi e Colonne
Sotto la summary area si trova la task area, che include una serie di campi e colonne che riportano informazioni sui processi in esecuzione:
PID
-
Identificativo di processo.
USER
-
Utente che ha eseguito il comando che ha generato il processo.
PR
-
Priorità del processo al kernel.
NI
-
Valore di nice del processo. I valori più bassi hanno una priorità più alta.
VIRT
-
Quantità totale di memoria utilizzata dal processo (incluso lo Swap).
RES
-
Memoria RAM utilizzata dal processo.
SHR
-
Memoria del processo condivisa con altri processi.
S
-
Stato del processo. I valori includono:
S
(interruptible sleep — in attesa del termine di un evento),R
(runnable — in esecuzione o in coda da eseguire) oZ
(zombie - processi figli terminati le cui strutture dati non sono ancora state rimosse dalla tabella dei processi). %CPU
-
Percentuale di CPU utilizzata dal processo.
%MEM
-
Percentuale di RAM utilizzata dal processo, ovvero il valore
RES
espresso in percentuale. TIME+
-
Tempo totale di attività del processo.
COMMAND
-
Nome del comando/programma che ha generato il processo.
Visualizzazione statica dei processi: ps
Come detto sopra, ps
mostra un’istantanea dei processi. Per vedere tutti i processi con un terminale (tty
), digita ps a
:
$ ps a PID TTY STAT TIME COMMAND 386 tty1 Ss+ 0:00 /sbin/agetty --noclear tty1 linux 424 tty7 Ssl+ 0:00 /usr/lib/xorg/Xorg :0 -seat seat0 (...) 655 pts/0 Ss 0:00 -bash 1186 pts/0 R+ 0:00 ps a (...)
Una Spiegazione della Sintassi e dell’Output delle Opzioni di ps
Per quanto riguarda le opzioni, ps
può accettare tre diversi stili: BSD, UNIX e GNU. Vediamo come funziona ciascuno di questi stili quando si cercano informazioni su un particolare ID processo:
- BSD
-
Le opzioni non seguono alcun trattino iniziale:
$ ps p 811 PID TTY STAT TIME COMMAND 811 pts/0 S 0:00 -su
- UNIX
-
Le opzioni seguono un trattino iniziale:
$ ps -p 811 PID TTY TIME CMD 811 pts/0 00:00:00 bash
- GNU
-
Le opzioni seguono due trattini iniziali:
$ ps --pid 811 PID TTY TIME CMD 811 pts/0 00:00:00 bash
In tutti e tre i casi, ps
riporta le informazioni sul processo il cui PID
è 811
— in questo caso, bash
.
Allo stesso modo, puoi usare ps
per cercare i processi avviati da un particolare utente:
-
ps U carol
(BSD) -
ps -u carol
(UNIX) -
ps --user carol
(GNU)
Controlliamo i processi avviati da carol
:
$ ps U carol PID TTY STAT TIME COMMAND 811 pts/0 S 0:00 -su 898 pts/0 R+ 0:00 ps U carol
Ha avviato due processi: bash
(-su
) e ps
(ps U carol
). La colonna STAT
ci dice lo stato del processo (vedi sotto).
Possiamo ottenere il meglio da ps
combinando alcune delle sue opzioni. Un comando molto utile (che produce un output simile a quello di top
) è ps aux
(stile BSD). In questo caso, vengono mostrati i processi di tutte le shell (non solo quella corrente). Il significato degli interruttori è il seguente:
a
-
Mostra i processi collegati a una
tty
o un terminale. u
-
Visualizza in un formato orientato all’utente.
x
-
Mostra i processi che non sono collegati a una
tty
o un terminale.
$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 204504 6780 ? Ss 14:04 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 14:04 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 14:04 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 14:04 0:00 [kworker/0:0H] root 7 0.0 0.0 0 0 ? S 14:04 0:00 [rcu_sched] root 8 0.0 0.0 0 0 ? S 14:04 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S 14:04 0:00 [migration/0] (...)
Spieghiamo il significato delle colonne:
USER
-
Titolare del processo.
PID
-
Identificativo di processo.
%CPU
-
Percentuale di CPU utilizzata.
%MEM
-
Percentuale di memoria fisica utilizzata.
VSZ
-
Memoria virtuale di processo in KiB.
RSS
-
Memoria fisica non di tipo swap utilizzata dal processo in KiB.
TT
-
Terminale (
tty
) che controlla il processo. STAT
-
Codice che rappresenta lo stato del processo. Oltre a
S
,R
eZ
(che abbiamo visto descrivendo l’output ditop
), altri possibili valori includono:D
(uninterruptible sleep — normalmente in attesa di I/O),T
(stopped — normalmente da un segnale di controllo). Alcuni modificatori extra includono:<
(high-priority — non adatto ad altri processi),N
(low-priority — non impattante con altri processi), o+
(nel gruppo di processi in primo piano). STARTED
-
Ora in cui è iniziato il processo.
TIME
-
Tempo CPU accumulato.
COMMAND
-
Comando che ha avviato il processo.
Esercizi Guidati
-
oneko
è un simpatico programma che mostra un gatto che insegue il cursore del mouse. Se non è già installato nel sistema desktop, installalo utilizzando il gestore di pacchetti della tua distribuzione. Lo useremo per studiare il controllo dei job.-
Avvia il programma. Come si fa a farlo?
-
Muovi il cursore del mouse per vedere come il gatto lo insegue. Ora sospendi il processo. Come si fa a farlo? Qual è l’output?
-
Controlla quanti job hai attualmente. Cosa scrivi? Qual è l’output?
-
Ora invialo in background specificando il suo job ID. Qual è l’output? Come puoi sapere che il lavoro è in esecuzione in background?
-
Infine, termina il job specificando il suo ID. Cosa scrivi?
-
-
Scopri i PID di tutti i processi generati dal server web Apache HTTPD (
apache2
) con due diversi comandi: -
Termina tutti i processi
apache2
senza usare i loro PID e con due diversi comandi: -
Supponi di dover terminare tutte le istanze di
apache2
e non hai tempo per scoprire quali sono i loro PID. Come lo realizzeresti usandokill
con il segnale predefinitoSIGTERM
in una riga: -
Avvia
top
e interagisci con esso eseguendo quanto segue:-
Mostra una vista della foresta dei processi:
-
Mostra i percorsi completi dei processi che si differenziano tra spazio utente e spazio kernel:
-
-
Digita il comando
ps
per visualizzare tutti i processi avviati dall’utente Apache HTTPD web server (wwwdata
):-
Utilizzando la sintassi BSD:
-
Utilizzando la sintassi UNIX:
-
Utilizzando la sintassi GNU:
-
Esercizi Esplorativi
-
Il segnale
SIGHUP
può essere usato come un modo per riavviare alcuni demoni. Con il server web Apache HTTPD — per esempio — l’invio diSIGHUP
al processo genitore(quello avviato dainit
) termina i suoi figli. Il genitore, tuttavia, rilegge i suoi file di configurazione, riapre i file di log e genera un nuovo set di figli. Eseguire le seguenti attività:-
Avviare il web server:
-
Assicurati di conoscere il PID del processo genitore:
-
Riavvia il server web Apache HTTPD inviando il segnale
SIGHUP
al processo genitore: -
Controlla che il genitore non sia stato terminato e che siano stati generati nuovi figli:
-
-
Sebbene inizialmente statico, l’output di
ps
può essere reso dinamico combinandops
ewatch
. Monitoreremo il server web Apache HTTPD per nuove connessioni. Prima di eseguire le attività descritte di seguito si consiglia di leggere la descrizione della direttivaMaxConnectionsPerChild
in https://httpd.apache.org/docs/current/mod/mpm_common.html [Apache MPM Common Directives].-
Aggiungi la direttiva
MaxConnectionsPerChild
con un valore di1
nel file di configurazione diapache2
- in Debian e derivati che si trova in/etc/apache2/apache2.conf
; nella famiglia CentOS, in/etc/httpd/conf/httpd.conf
. Non dimenticare di riavviareapache2
affinché le modifiche abbiano effetto. -
Digita un comando che usi
watch
,ps
egrep
per le connessioniapache2
. -
Ora apri un browser web o usa un browser a riga di comando come
lynx
per stabilire una connessione al server web tramite il suo indirizzo IP. Cosa osservi nell’output diwatch
?
-
-
Come hai imparato, per impostazione predefinita
top
ordina le attività in base alla percentuale di utilizzo della CPU in ordine decrescente (i valori maggiori in alto). Questo comportamento può essere modificato con i tasti interattiviM
(memory usage),N
(process unique identifier),T
(running time) eP
(percentage of CPU time). Tuttavia, puoi anche ordinare l’elenco delle attività a tuo piacimento avviandotop
con l’opzione-o
(per maggiori informazioni, controlla la paginaman
di top). Ora, esegui le seguenti attività:-
Avvia
top
in modo che le attività siano ordinate in base all’utilizzo della memoria: -
Verifica di aver digitato il comando corretto evidenziando la colonna della memoria:
-
-
ps
ha anche un’opzioneo
per specificare le colonne che vuoi mostrare. Esamina questa opzione ed esegui le seguenti attività:-
Avvia
ps
in modo che vengano mostrate solo le informazioni su user, percentage of memory used, percentage of CPU time used e full command: -
Ora, avvia
ps
in modo che le uniche informazioni visualizzate siano quelle dell’utente e il nome dei programmi che stanno utilizzando:
-
Sommario
In questa lezione hai imparato a conoscere jobs e job control. Fatti e concetti importanti da tenere a mente sono:
-
I lavori (jobs) sono processi che vengono inviati in background.
-
Oltre a un _ ID processo_, ai lavori viene assegnato anche un _ ID lavoro_ quando vengono creati.
-
Per controllare i lavori, è richiesta una specifica di lavoro (
jobspec
). -
I lavori possono essere portati in primo piano, inviati in secondo piano, sospesi e terminati (o uccisi).
-
Un lavoro può essere scollegato dal terminale e dalla sessione in cui è stato creato.
Allo stesso modo, abbiamo anche discusso il concetto di processi e monitoraggio del processo. I concetti più rilevanti sono:
-
I processi stanno eseguendo programmi.
-
I processi possono essere monitorati.
-
Diverse utilità ci consentono di scoprire l 'ID dei processi e di inviare loro segnali.
-
I segnali possono essere specificati per nome (es.
-SIGTERM
), numero (es.-15
) o attraverso un opzione (es.-S SIGTERM
). -
top
eps
sono molto potenti quando si tratta di monitorare i processi. L’output del primo è dinamico e si aggiorna costantemente;ps
rivela invece l’output staticamente.
Commandi utilizzati in questa lezione:
jobs
-
Visualizza i lavori attivi e il loro stato.
sleep
-
Ritardo per un periodo di tempo specifico.
fg
-
Porta il lavoro in primo piano.
bg
-
Sposta il lavoro in background.
kill
-
Termina il lavoro.
nohup
-
Scollega il lavoro dalla sessione/terminale.
exit
-
Escce dalla shell corrente.
tail
-
Visualizza le righe più recenti in un file.
watch
-
Esegue ripetutamente un comando.(ogni 2 secondi di default).
uptime
-
Visualizza per quanto tempo il sistema è in esecuzione, il numero di utenti correnti e il carico medio del sistema.
free
-
Visualizza l’utilizzo della memoria.
pgrep
-
Cerca l’ID del processo in base al nome.
pidof
-
Cerca l’ID del processo in base al nome.
pkill
-
Invia segnale al processo per nome.
killall
-
Elimina i processi per nome.
top
-
Visualizza i processi Linux.
ps
-
Visualizza un’istantanea dei processi in corso.
Risposte agli Esercizi Guidati
-
oneko
è un simpatico programma che mostra un gatto che insegue il cursore del mouse. Se non è già installato nel sistema desktop, installalo utilizzando il gestore di pacchetti della tua distribuzione. Lo useremo per studiare il controllo dei job.-
Avvia il programma. Come si fa a farlo?
Digitando
oneko
all’interno di un terminale. -
Muovi il cursore del mouse per vedere come il gatto lo insegue. Ora sospendi il processo. Come si fa a farlo? Qual è l’output?
Premendo la combinazione di tasti
Ctrl+Z
:[1]+ Stopped oneko
-
Controlla quanti job hai attualmente. Cosa scrivi? Qual è l’output?
$ jobs [1]+ Stopped oneko
-
Ora invialo in background specificando il suo job ID. Qual è l’output? Come puoi sapere che il lavoro è in esecuzione in background?
$ bg %1 [1]+ oneko &
Il gatto si muove nuovamente.
-
Infine, termina il job specificando il suo ID. Cosa scrivi?
$ kill %1
-
-
Scopri i PID di tutti i processi generati dal server web Apache HTTPD (
apache2
) con due diversi comandi:$ pgrep apache2
o
$ pidof apache2
-
Termina tutti i processi
apache2
senza usare i loro PID e con due diversi comandi:$ pkill apache2
o
$ killall apache2
-
Supponi di dover terminare tutte le istanze di
apache2
e non hai tempo per scoprire quali sono i loro PID. Come lo realizzeresti usandokill
con il segnale predefinitoSIGTERM
in una riga:$ kill $(pgrep apache2) $ kill `pgrep apache2`
oppure
$ kill $(pidof apache2) $ kill `pidof apache2`
NotePoiché
SIGTERM
(15
) è il segnale predefinito, non è necessario passare alcuna opzione akill
. -
Avvia
top
e interagisci con esso eseguendo quanto segue:-
Mostra una vista della foresta dei processi:
Premi
V
. -
Mostra i percorsi completi dei processi che si differenziano tra spazio utente e spazio kernel:
Premi
c
.
-
-
Digita il comando
ps
per visualizzare tutti i processi avviati dall’utente Apache HTTPD web server (wwwdata
):-
Utilizzando la sintassi BSD:
$ ps U www-data
-
Utilizzando la sintassi UNIX:
$ ps -u www-data
-
Utilizzando la sintassi GNU:
$ ps --user www-data
-
Risposte agli Esercizi Esplorativi
-
Il segnale
SIGHUP
può essere usato come un modo per riavviare alcuni demoni. Con il server web Apache HTTPD — per esempio — l’invio diSIGHUP
al processo genitore(quello avviato dainit
) termina i suoi figli. Il genitore, tuttavia, rilegge i suoi file di configurazione, riapre i file di log e genera un nuovo set di figli. Eseguire le seguenti attività:-
Avviare il web server:
$ sudo systemctl start apache2
-
Assicurati di conoscere il PID del processo genitore:
$ ps aux | grep apache2
Il processo genitore è quello avviato dall’utente
root
. Nel nostro caso quello con PID1653
. -
Riavvia il server web Apache HTTPD inviando il segnale
SIGHUP
al processo genitore:$ kill -SIGHUP 1653
-
Controlla che il genitore non sia stato terminato e che siano stati generati nuovi figli:
$ ps aux | grep apache2
Ora dovresti vedere il processo genitore
apache2
insieme a due nuovi processi figli.
-
-
Sebbene inizialmente statico, l’output di
ps
può essere reso dinamico combinandops
ewatch
. Monitoreremo il server web Apache HTTPD per nuove connessioni. Prima di eseguire le attività descritte di seguito si consiglia di leggere la descrizione della direttivaMaxConnectionsPerChild
in https://httpd.apache.org/docs/current/mod/mpm_common.html [Apache MPM Common Directives].-
Aggiungi la direttiva
MaxConnectionsPerChild
con un valore di1
nel file di configurazione diapache2
- in Debian e derivati che si trova in/etc/apache2/apache2.conf
; nella famiglia CentOS, in/etc/httpd/conf/httpd.conf
. Non dimenticare di riavviareapache2
affinché le modifiche abbiano effetto.La riga da includere nel file di configurazione è
MaxConnectionsPerChild 1
. Un modo per riavviare il server web è tramite:sudo systemctl restart apache2
. -
Digita un comando che usi
watch
,ps
egrep
per le connessioniapache2
.$ watch 'ps aux | grep apache2'
o
$ watch "ps aux | grep apache2"
-
Ora apri un browser web o usa un browser a riga di comando come
lynx
per stabilire una connessione al server web tramite il suo indirizzo IP. Cosa osservi nell’output diwatch
?Uno dei processi figlio di proprietà di
www-data
scompare.
-
-
Come hai imparato, per impostazione predefinita
top
ordina le attività in base alla percentuale di utilizzo della CPU in ordine decrescente (i valori maggiori in alto). Questo comportamento può essere modificato con i tasti interattiviM
(memory usage),N
(process unique identifier)),T
(running time) eP
(percentage of CPU time). Tuttavia, puoi anche ordinare l’elenco delle attività a tuo piacimento avviandotop
con l’opzione-o
(per maggiori informazioni, controlla la paginaman
di top). Ora, esegui le seguenti attività:-
Avvia
top
in modo che le attività siano ordinate in base all’utilizzo della memoria:$ top -o %MEM
-
Verifica di aver digitato il comando corretto evidenziando la colonna della memoria:
Premi
x
.
-
-
ps
ha anche un’opzioneo
per specificare le colonne che vuoi mostrare. Esamina questa opzione ed esegui le seguenti attività:-
Avvia
ps
in modo che vengano mostrate solo le informazioni su user, percentage of memory used, percentage of CPU time used e full command:$ ps o user,%mem,%cpu,cmd
-
Ora, avvia
ps
in modo che le uniche informazioni visualizzate siano quelle dell’utente e il nome dei programmi che stanno utilizzando:$ ps o user,comm
-