prof. Nunzio Brugaletta |
atapSO |
EnneBi –
Computer Science
Avanti – Indietro – Inizio
La pagina man della bash riporta che il job control
indica la capacità di fermare (sospendere) selettivamente l’esecuzione di processi e continuare (riprendere) la loro esecuzione più tardi. Tipicamente, un utente impiega questo servizio attraverso una interfaccia interattiva fornita unitamente dal driver del terminale del sistema e dalla bash. |
Per trattare questo argomento è necessario premettere alcune definizioni:
Job di shell. Un programma in esecuzione genera un processo. Il programma può a sua volta mandare in esecuzione un altro programma e quindi si genera un nuovo processo. In genere con una riga di comando della shell si avvia un programma, ma può avvenire che con una singola linea di comando si lancino più comandi, per esempio come nel caso della redirezione. Un job rappresenta tutti i processi generati da una riga di comando.
Processo in foreground. In un sistema multitasking si intende con tale nome il processo corrente che può ricevere input da tastiera o usare il terminale per i suoi output.
Processo in background. Si tratta di un processo che non richiede interattività con l'utente e quindi può funzionare senza impegnare il terminale.
Si può, ora, passare ad esaminare i comandi per la gestione dei job:
$ ps PID TTY TIME CMD 1271 tty1 00:00:00 bash 1313 tty1 00:00:00 ps $ emacs & [1] 1314 $ ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND tux 1271 0.0 0.4 4044 1596 pts/0 S 17:44 0:00 bash tux 1314 0.0 2.4 12408 7948 pts/0 S 17:52 0:00 emacs tux 1326 0.0 0.2 2572 656 pts/0 R 18:11 0:00 ps u
il primo comando impartito mostra i processi attualmente avviati dall'utente: il 1271 la bash e il 1313, il comando ps. Nella successiva riga di comando viene avviato in background emacs. La riga di comando è terminata dal carattere & che serve appunto per lanciare un programma in background. Il sistema risponde con due numeri: 1 il numero di job, 1314 il PID del processo.
In questo momento non si può interagire con emacs, non si vede la schermata ma al suo posto c'è nuovamente il prompt di sistema. Il successivo comando ps mostra la presenza, oltre a se stesso, di due processi. In questo caso è usato il parametro u (User) che fornisce anche informazioni sull'utente, l'occupazione di memoria (Virtual e Resident Size) e lo stato attuale del processo. Bash ed emacs sono in stato Sleeping, ps è in stato Running (la colonna STAT).
Nel momento della visualizzazione il processo in stato di Running era quello associato all'esecuzione del comando ps -u. I processi associati all'esecuzione delle linee di comando ps e emacs, essendo programmi interattivi, sono in attesa di input da tastiera e quindi si trovano in stato di Sleeping.
$ jobs [1]+ Running emacs &
Il comando jobs elenca i job avviati con il proprio numero identificativo e la riga di comando associata ad essi.
$ fg 1 emacs
il comando fg seguito dal numero di job, porta in primo piano emacs. Per tornare al prompt di sistema bisogna sospendere il processo attualmente in primo piano. Ciò avviene premendo la combinazione di tasti Ctrl+z.
[1]+ Stopped emacs $ ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND tux 1271 0.0 0.4 4044 1596 tty1 S 17:44 0:00 bash tux 1314 0.0 2.4 12408 7948 tty1 T 17:52 0:00 emacs tux 1325 0.0 0.2 2572 656 tty1 R 18:11 0:00 ps u
Il sistema risponde con il messaggio di stop: il processo si è bloccato (STAT riporta sTopped) ed è passato in background. Se fosse stato un programma che poteva proseguire l'esecuzione senza interazione con l'utente, si sarebbe potuto mandare un segnale di continuazione:
$ bg 1 [1]+ emacs & $ ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND tux 1271 0.0 0.4 4044 1596 tty1 S 17:44 0:00 bash tux 1314 0.0 2.4 12408 7948 tty1 S 17:52 0:00 emacs tux 1327 0.0 0.2 2572 656 tty1 R 18:11 0:00 ps u
il processo emacs è transitato in stato Sleeping.
Per terminare un processo è necessario mandare al processo un apposito segnale:
$ kill -SIGKILL 1314 $ ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND tux 1271 0.0 0.4 4044 1596 tty1 S 17:44 0:00 bash tux 1347 0.0 0.2 2568 652 tty1 R 18:53 0:00 ps u [1]+ Killed emacs
il comando kill lancia un messaggio di terminazione e il parametro -SIGKILL aggiunge il fatto che la terminazione deve essere incondizionata.
http://ennebi.solira.org |
ennebi@solira.org |