GNU/Linux >> Tutoriels Linux >  >> Linux

Linux Bash Scripting Part5 - Signaux et tâches

Dans le post précédent, nous avons parlé de l'entrée, de la sortie et de la redirection dans les scripts bash. Aujourd'hui, nous allons apprendre à les exécuter et à les contrôler sur un système Linux. Jusqu'à présent, nous ne pouvons exécuter des scripts qu'à partir de l'interface de ligne de commande, mais ce n'est pas la seule façon d'exécuter des scripts bash Linux.

Cet article décrit les différentes manières de contrôler vos scripts bash Linux.

Signaux Linux

Voici les signaux système Linux les plus courants :

Nombre Nom Tâche
1 SIGHUP Le processus raccroche.
2 SIGINT Interruption de processus.
3 SIGQUIT Les processus se terminent ou s'arrêtent.
9 SIGKILL Arrêt du processus.
15 SIGTERM Arrêt du processus.
17 SIGSTOP Arrêt du processus sans fin.
18 SIGTSTP Arrêt ou pause du processus sans fin.
19 SIGCON Poursuite du processus après l'arrêt.

Vos scripts bash Linux ne contrôlent pas ces signaux. Vous pouvez programmer votre script bash pour qu'il reconnaisse les signaux et exécute des commandes en fonction du signal envoyé.

Arrêter un processus

Pour arrêter un processus en cours d'exécution, vous pouvez appuyer sur Ctrl+C, ce qui génère un signal SIGINT pour arrêter le processus en cours d'exécution dans le shell.

$ sleep 100

Ctrl+C

Suspendre un processus

Les touches Ctrl+Z génèrent un signal SIGTSTP pour arrêter tout processus en cours d'exécution dans le shell, ce qui laisse le programme en mémoire.

$ sleep 100

Ctrl+Z

Le nombre entre parenthèses, qui est (1), est le numéro de travail.

Si vous essayez de quitter le shell et qu'une tâche arrêtée est affectée à votre shell, le bash vous avertit si vous.

Vous pouvez utiliser la commande ps pour afficher les travaux arrêtés.

ps –l

Dans la colonne S (état du processus), il affiche les états tracé (T) ou arrêté (S).

Si vous souhaitez mettre fin à une tâche arrêtée, vous pouvez tuer son processus à l'aide de la commande kill.

kill processID

Signaux de piège

Pour piéger les signaux, vous pouvez utiliser la commande trap . Si le script reçoit un signal défini par la commande trap, il arrête le traitement et à la place, le script gère le signal.

Vous pouvez piéger les signaux à l'aide de la commande trap comme ceci :

#!/bin/bash

trap "echo 'Ctrl-C was trapped'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "#$total"

	sleep 2

	total=$(($total + 1))

done

Chaque fois que vous appuyez sur Ctrl+C, le signal est piégé et le message est imprimé.

Si vous appuyez sur Ctrl+C, l'instruction echo spécifiée dans la commande trap est imprimée au lieu d'arrêter le script. Cool, non ?

Intercepter la sortie du script

Vous pouvez intercepter la sortie du script shell à l'aide de la commande trap comme ceci :

#!/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

Lorsque le script bash se termine, le message d'adieu est imprimé comme prévu.

De plus, si vous quittez le script avant d'avoir terminé son travail, le piège EXIT sera déclenché.

Modifier ou supprimer un piège

Vous pouvez relancer la commande trap avec de nouvelles options comme celle-ci :

#!/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

Remarquez comment le script gère le signal après avoir modifié le signal trap.

Vous pouvez également supprimer un piège en utilisant deux tirets.

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

Remarquez comment le script traite le signal avant de supprimer le déroutement et après avoir supprimé le déroutement.

$ ./myscript

Crtl+C

Le premier Ctrl + C a été piégé et le script continue de s'exécuter tandis que le second quitte le script car le piège a été supprimé.

Exécuter des scripts Linux Bash en arrière-plan

Si vous voyez la sortie de la commande ps, vous verrez tous les processus en cours d'exécution en arrière-plan et non liés au terminal.

Nous pouvons faire la même chose, placez simplement le symbole esperluette (&) après la commande.

#!/bin/bash

total=1

while [ $total -le 3 ]; do

	sleep 2

	total=$(($total + 1))

done
$ ./myscipt &

Une fois que vous avez fait cela, le script s'exécute dans un processus d'arrière-plan séparé sur le système, et vous pouvez voir l'identifiant du processus entre les crochets.

Une fois le script terminé, un message s'affiche sur le terminal.

Notez que pendant que le processus en arrière-plan est en cours d'exécution, vous pouvez utiliser votre moniteur de terminal pour les messages STDOUT et STDERR, donc si une erreur se produit, vous verrez le message d'erreur et la sortie normale.

Le processus en arrière-plan se terminera si vous quittez votre session de terminal.

Et si vous voulez continuer à courir même si vous fermez le terminal ?

Exécuter des scripts sans accroc

Vous pouvez exécuter vos scripts bash Linux en arrière-plan même si vous quittez la session de terminal à l'aide de la commande nohup .

La commande nohup bloque tous les signaux SIGHUP. Il empêche le processus de se terminer lorsque vous quittez votre terminal.

$ nohup ./myscript &

Après avoir exécuté la commande nohup, vous ne pouvez voir aucune sortie ou erreur de votre script. Vous avez envoyé les messages de sortie et d'erreur dans un fichier appelé nohup.out .

Remarque :lors de l'exécution de plusieurs commandes à partir du même répertoire, le contenu du fichier nohup.out sera remplacé.

Afficher les tâches

Pour afficher les travaux en cours, vous pouvez utiliser la commande jobs.

#!/bin/bash

total=1

while [ $total -le 3 ]; do

	echo "#$count"

	sleep 5

	total=$(($total + 1))

done

Ensuite, lancez-le.

$ ./myscript

Appuyez ensuite sur Ctrl+Z pour arrêter le script.

Exécutez le même script bash mais en arrière-plan en utilisant le symbole esperluette et redirigez la sortie vers un fichier juste pour clarification.

$ ./myscript > outfile &

La commande jobs affiche les tâches arrêtées et en cours d'exécution.

jobs –l

-l paramètre pour afficher l'ID du processus

Redémarrage des travaux arrêtés

Vous pouvez utiliser la commande bg pour redémarrer une tâche en arrière-plan.

$ ./myscript

Appuyez ensuite sur Ctrl+Z

Maintenant, il est arrêté.

$ bg

Après avoir utilisé la commande bg, il s'exécute maintenant en arrière-plan.

Si vous avez plusieurs travaux arrêtés, vous pouvez faire de même en spécifiant le numéro du travail à la commande bg.

Vous pouvez utiliser la commande fg pour redémarrer une tâche en mode premier plan.

$ fg 1

Planifier une tâche

Le système Linux propose deux manières d'exécuter un script bash à une heure prédéfinie :

  • sur commande.
  • table cron.

La commande at

C'est le format de la commande

à l'heure [-f nom_fichier]

La commande at peut accepter différents formats d'heure :

  • Format d'heure standard comme 10:15.
  • Un indicateur AM/PM comme 23h15.
  • Une heure nommée comme maintenant, minuit.

Vous pouvez inclure une date spécifique, en utilisant différents formats de date :

  • Un format de date standard, tel que MMJJAA ou JJ.MM.AA.
  • Une date textuelle, telle que le 10 juin ou le 12 février, avec ou sans l'année.
  • Maintenant + 25 minutes.
  • 05h15 demain.
  • 11h15 + 7 jours.

Nous ne voulons pas approfondir la commande at, mais pour l'instant, simplifiez-la.

$ at -f ./myscript now

Vous pouvez utiliser le paramètre -M pour envoyer la sortie par e-mail si le système a un e-mail, et si ce n'est pas le cas, cela supprimera la sortie de la commande at.

Pour lister les travaux en attente, utilisez la commande atq :

Supprimer les tâches en attente

Pour supprimer une tâche en attente, utilisez la commande atrm :

$ atrm 18

Vous devez spécifier le numéro de travail à la commande atrm.

Scripts de planification

Que faire si vous avez besoin d'exécuter un script à la même heure chaque jour ou chaque mois ?

Vous pouvez utiliser la commande crontab pour planifier des tâches.

Pour lister les tâches planifiées, utilisez le paramètre -l :

$ crontab –l

Le format de crontab est :

minute, heure, jour du mois, mois et jour de la semaine

Ainsi, si vous souhaitez exécuter une commande tous les jours à 10h30, saisissez ce qui suit :

30 10 * * * commande

Le caractère générique (*) utilisé pour indiquer que le cron exécutera la commande quotidiennement tous les mois à 10h30.

Pour exécuter une commande à 17h30 tous les mardis, vous utiliserez ce qui suit :

30 17 * * 2 commande

Le jour de la semaine commence de 0 à 6, où dimanche=0 et samedi=6.

Pour exécuter une commande à 10h00 au début de chaque mois :

00 10 1 * * commande

Le jour du mois est compris entre 1 et 31.

Restons simples pour l'instant, et nous discuterons du cron en détail dans les prochains articles.

Pour modifier la table cron, utilisez le paramètre -e comme ceci :

crontab –e

Tapez ensuite votre commande comme suit :

 30 10 * * * /home/likegeeks/Desktop/myscript

Cela programmera notre script pour qu'il s'exécute à 10h30 tous les jours.

Remarque :Parfois, vous voyez une erreur indiquant que la ressource est temporairement indisponible.

Tout ce que vous avez à faire est ceci :

$ rm -f /var/run/crond.pid

Vous devez être un utilisateur root pour ce faire.

C'est aussi simple que ça !

Vous pouvez utiliser l'un des répertoires de script cron préconfigurés comme :

/etc/cron.hourly

/etc/cron.daily

/etc/cron.weekly

/etc/cron.monthly

Placez simplement votre fichier de script bash dans l'un de ces répertoires et il s'exécutera périodiquement.

Démarrage des scripts à la connexion

Dans les articles précédents, nous avons parlé des fichiers de démarrage. Je vous recommande de les consulter.

$HOME/.bash_profile

$HOME/.bash_login

$HOME/.profil

Pour exécuter vos scripts à la connexion, placez votre code dans

$HOME/.bash_profile

.

Démarrage des scripts à l'ouverture du shell

OK, qu'en est-il de l'exécution de notre script bash à l'ouverture du shell ? Facile.

Tapez votre script sur

 .bashrc

fichier.

Et maintenant, si vous ouvrez la fenêtre du shell, il exécutera cette commande.

J'espère que vous trouverez le message utile. Continuez à revenir.

Merci.


Linux
  1. Comment trouver et tuer le processus Zombie sous Linux

  2. Commandes Linux :jobs, bg et fg

  3. Fondamentaux des signaux Linux - Partie I

  4. terminaison de processus mmap, msync et linux

  5. Processus Linux en arrière-plan - Arrêté dans les travaux ?

Comment utiliser la commande de date dans les scripts bash sous Linux

Cron Jobs et Crontab sur Linux expliqués

Linux Bash Scripting Part5 - Signaux et tâches

Comment effacer l'historique de Bash sous Linux et Mac

Bash Scripting :comment générer et formater du texte sur le shell Linux

Comment suivre et tracer un processus Linux