GNU/Linux >> Linux Esercitazione >  >> Linux

Linux Bash Scripting Part5 – Segnali e lavori

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:

Num Nome Lavoro
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.


Linux
  1. Come trovare e uccidere il processo Zombie in Linux

  2. Comandi Linux:job, bg e fg

  3. mmap, msync e terminazione del processo linux

  4. Limite della linea Shebang nel kernel bash e linux

  5. Linux:visualizza e termina il processo rinnegato

Come utilizzare il comando Date negli script Bash in Linux

Spiegazione di Cron Jobs e Crontab su Linux

Linux Bash Scripting Part5 – Segnali e lavori

Come cancellare la cronologia di Bash in Linux e Mac

Bash Scripting:come generare e formattare il testo su Linux Shell

Come tracciare e tracciare un processo Linux