Nel post precedente abbiamo parlato di input, output e reindirizzamento negli script bash. Oggi impareremo come eseguirli e controllarli su un sistema Linux. Finora, possiamo eseguire script solo dall'interfaccia della riga di comando, ma questo non è l'unico modo per eseguire script bash Linux.
Questo post descrive i diversi modi per controllare gli script bash di Linux.
Segnali Linux
Questi sono i segnali di sistema Linux più comuni:
1 | SIGHUP | Il processo si interrompe. |
2 | SEGNO | Interruzione del processo. |
3 | SIGQUIT | Il processo si chiude o si interrompe. |
9 | SIGKILL | Interruzione del processo. |
15 | SIGTERM | Interruzione del processo. |
17 | SIGSTOP | Interruzione del processo senza terminazione. |
18 | SIGTSTP | Interruzione o sospensione del processo senza interruzione. |
19 | SIGCONT | Proseguimento del processo dopo l'arresto. |
I tuoi script bash Linux non controllano questi segnali. Puoi programmare il tuo script bash per riconoscere i segnali ed eseguire comandi in base al segnale che è stato inviato.
Interrompi un processo
Per interrompere un processo in esecuzione, puoi premere Ctrl+C, che genera un segnale SIGINT per interrompere il processo corrente in esecuzione nella shell.
$ sleep 100
Ctrl+C
Metti in pausa un processo
I tasti Ctrl+Z generano un segnale SIGTSTP per fermare tutti i processi in esecuzione nella shell e questo lascia il programma in memoria.
$ sleep 100
Ctrl+Z
Il numero tra parentesi, che è (1), è il numero del lavoro.
Se provi a uscire dalla shell e hai un lavoro interrotto assegnato alla tua shell, bash ti avvisa se lo fai.
Puoi usare il comando ps per visualizzare i lavori interrotti.
ps –l
Nella colonna S (stato del processo), mostra gli stati tracciati (T) o fermati (S).
Se vuoi terminare un lavoro interrotto, puoi terminare il suo processo usando il comando kill.
kill processID
Segnali trappola
Per intercettare i segnali, puoi utilizzare il comando trap . Se lo script riceve un segnale definito dal comando trap, interrompe l'elaborazione e, invece, lo script gestisce il segnale.
Puoi intercettare i segnali utilizzando il comando trap in questo modo:
#!/bin/bash trap "echo 'Ctrl-C was trapped'" SIGINT total=1 while [ $total -le 3 ]; do echo "#$total" sleep 2 total=$(($total + 1)) done
Ogni volta che premi Ctrl+C, il segnale viene catturato e il messaggio viene stampato.
Se si preme Ctrl+C, viene stampata l'istruzione echo specificata nel comando trap invece di arrestare lo script. Bello, vero?
Trapping dell'uscita dello script
Puoi intercettare l'uscita dello script della shell usando il comando trap in questo modo:
#!/bin/bash # Add the EXIT signal to trap it trap "echo Goodbye..." EXIT total=1 while [ $total -le 3 ]; do echo "#$total" sleep 2 total=$(($total + 1)) done
Quando lo script bash si chiude, il messaggio di arrivederci viene stampato come previsto.
Inoltre, se esci dallo script prima di terminarne il lavoro, verrà attivata la trappola EXIT.
Modificare o rimuovere una trappola
Puoi emettere nuovamente il comando trap con nuove opzioni come questa:
#!/bin/bash trap "echo 'Ctrl-C is trapped.'" SIGINT total=1 while [ $total -le 3 ]; do echo "Loop #$total" sleep 2 total=$(($total + 1)) done # Trap the SIGINT trap "echo ' The trap changed'" SIGINT total=1 while [ $total -le 3 ]; do echo "Second Loop #$total" sleep 1 total=$(($total + 1)) done
Nota come lo script gestisce il segnale dopo aver cambiato la trappola del segnale.
Puoi anche rimuovere una trappola utilizzando due trattini.
trap -- SIGNAL
#!/bin/bash trap "echo 'Ctrl-C is trapped.'" SIGINT total=1 while [ $total -le 3 ]; do echo "#$total" sleep 1 total=$(($total + 1)) done trap -- SIGINT echo "I just removed the trap" total=1 while [ $total -le 3 ]; do echo "Loop #2 #$total" sleep 2 total=$(($total + 1)) done
Nota come lo script elabora il segnale prima di rimuovere la trap e dopo aver rimosso la trap.
$ ./myscript
Crtl+C
Il primo Ctrl+C è stato bloccato e lo script continua a essere eseguito mentre il secondo esce dallo script perché il trap è stato rimosso.
Esecuzione di script Bash Linux in modalità background
Se vedi l'output del comando ps, vedrai tutti i processi in esecuzione in background e non legati al terminale.
Possiamo fare lo stesso, basta posizionare il simbolo della e commerciale (&) dopo il comando.
#!/bin/bash total=1 while [ $total -le 3 ]; do sleep 2 total=$(($total + 1)) done
$ ./myscipt &
Dopo averlo fatto, lo script viene eseguito in un processo in background separato sul sistema e puoi vedere l'ID del processo tra parentesi quadre.
Quando lo script si esaurisce, vedrai un messaggio sul terminale.
Nota che mentre il processo in background è in esecuzione, puoi utilizzare il monitor del terminale per i messaggi STDOUT e STDERR, quindi se si verifica un errore, vedrai il messaggio di errore e l'output normale.
Il processo in background verrà chiuso se esci dalla sessione del terminale.
E se volessi continuare a correre anche se chiudi il terminale?
Esecuzione degli script senza riagganciare
Puoi eseguire i tuoi script bash Linux in background anche se esci dalla sessione del terminale utilizzando il comando nohup .
Il comando nohup blocca tutti i segnali SIGHUP. Impedisce l'uscita del processo quando esci dal terminale.
$ nohup ./myscript &
Dopo aver eseguito il comando nohup, non puoi vedere alcun output o errore dal tuo script. Hai inviato l'output e i messaggi di errore a un file chiamato nohup.out .
Nota:quando si eseguono più comandi dalla stessa directory, il contenuto del file nohup.out verrà sovrascritto.
Visualizzazione dei lavori
Per visualizzare i lavori correnti, puoi utilizzare il comando lavori.
#!/bin/bash total=1 while [ $total -le 3 ]; do echo "#$count" sleep 5 total=$(($total + 1)) done
Quindi eseguilo.
$ ./myscript
Quindi premi Ctrl+Z per interrompere lo script.
Esegui lo stesso script bash ma in background usando il simbolo della e commerciale e reindirizza l'output a un file solo per chiarimenti.
$ ./myscript > outfile &
Il comando jobs mostra i lavori interrotti e in esecuzione.
jobs –l
-l parametro per visualizzare l'ID del processo
Riavvio dei lavori interrotti
È possibile utilizzare il comando bg per riavviare un lavoro in modalità background.
$ ./myscript
Quindi premi Ctrl+Z
Ora è fermo.
$ bg
Dopo aver utilizzato il comando bg, ora è in esecuzione in modalità background.
Se hai più lavori interrotti, puoi fare lo stesso specificando il numero del lavoro nel comando bg.
Puoi usare il comando fg per riavviare un lavoro in modalità primo piano.
$ fg 1
Programmazione di un lavoro
Il sistema Linux fornisce due modi per eseguire uno script bash in un momento predefinito:
- al comando.
- tabella cron.
Il comando at
Questo è il formato del comando
all'ora di [-f filename]
Il comando at può accettare diversi formati di tempo:
- Formato dell'ora standard come 10:15.
- Un indicatore AM/PM come le 23:15.
- Un'ora con nome come adesso, mezzanotte.
Puoi includere una data specifica, utilizzando alcuni formati di data diversi:
- Un formato di data standard, come MMGGAA o GG.MM.AA.
- Una data di testo, come il 10 giugno o il 12 febbraio, con o senza l'anno.
- Ora + 25 minuti.
- 05:15 domani.
- 11:15 + 7 giorni.
Non vogliamo approfondire il comando at, ma per ora rendilo semplice.
$ at -f ./myscript now
Puoi utilizzare il parametro -M per inviare l'output all'e-mail se il sistema ha un'e-mail e, in caso contrario, questo sopprimerà l'output del comando at.
Per elencare i lavori in sospeso, usa il comando atq:
Rimuovi i lavori in sospeso
Per rimuovere un lavoro in sospeso, usa il comando atrm:
$ atrm 18
Devi specificare il numero del lavoro nel comando atrm.
Script di pianificazione
Cosa succede se devi eseguire uno script alla stessa ora ogni giorno o ogni mese o giù di lì?
Puoi utilizzare il comando crontab per pianificare i lavori.
Per elencare i lavori pianificati, utilizzare il parametro -l:
$ crontab –l
Il formato per crontab è:
minuto, ora, giorno del mese, mese e giorno della settimana
Quindi, se vuoi eseguire un comando ogni giorno alle 10:30, digita quanto segue:
30 10 * * * comando
Il carattere jolly (*) utilizzato per indicare che il cron eseguirà il comando ogni giorno ogni mese alle 10:30.
Per eseguire un comando alle 17:30 ogni martedì, dovresti utilizzare quanto segue:
30 17 * * 2 comando
Il giorno della settimana inizia da 0 a 6, dove domenica=0 e sabato=6.
Per eseguire un comando alle 10:00 all'inizio di ogni mese:
00 10 1 * * comando
Il giorno del mese va dall'1 al 31.
Manteniamo le cose semplici per ora e discuteremo del cron in dettaglio nei post futuri.
Per modificare la tabella cron, usa il parametro -e in questo modo:
crontab –e
Quindi digita il tuo comando come il seguente:
30 10 * * * /home/likegeeks/Desktop/myscript
Questo pianificherà l'esecuzione del nostro script ogni giorno alle 10:30.
Nota:a volte, viene visualizzato un messaggio di errore che dice Risorsa temporaneamente non disponibile.
Tutto quello che devi fare è questo:
$ rm -f /var/run/crond.pid
Dovresti essere un utente root per farlo.
Semplicemente così!
Puoi utilizzare una delle directory di script cron preconfigurate come:
/etc/cron.hourly
/etc/cron.daily
/etc/cron.settimanale
/etc/cron.mensile
Metti il tuo file di script bash in una di queste directory e verrà eseguito periodicamente.
Avvio degli script all'accesso
Nei post precedenti abbiamo parlato dei file di avvio. Ti consiglio di esaminarli.
$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profilo
Per eseguire i tuoi script all'accesso, inserisci il tuo codice in
$HOME/.bash_profile
.
Avvio degli script all'apertura della shell
OK, che ne dici di eseguire il nostro script bash all'apertura della shell? Facile.
Digita il tuo script su
.bashrc
file.
E ora, se apri la finestra della shell, eseguirà quel comando.
Spero che il post ti sia utile. Continua a tornare.
Grazie.