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 :
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.