Articles avec #script tag

Publié le 9 Mars 2017

Pour vérifier que mes micro services sont accessible j'ai implémenté un endpoint qui répond simplement avec un statut 200 (OK) si le service est accessible.

L'idée est de pouvoir tester si le service est accessible en utilisant un script shell.

Cela peut se faire en utilisant cURL avec la commande suivante:

curl -s -o /dev/null -I -w "%{http_code}" http://mon.micro.service.local/api/health

Remplacer l'URL par celle de votre service. Le résultat de cette commande est uniquement l'affichage du statut HTTP de la réponse.

On peut ensuite intégrer cette commande dans un script, pour, par exemple, attendre que le service soit accessible avant de lancer un test ou autre.  

while [ $(curl -s -o /dev/null -I -w "%{http_code}" http://mon.micro.service.local/api/health) -ne 200 ]
do
   echo "Waiting for micro-service"
   sleep 5
done
echo "Service started"

Tant que la commande cURL ne retourne pas 200 (OK) on attend 5 secondes et on réessaye. Quand on sort de la boucle while, le service est accessible.

Voir les commentaires

Rédigé par Bliz

Publié dans #Linux, #Script

Repost 0

Publié le 21 Février 2013

la commande 'date' unix permet d'afficher/fixer la date courante mais on peut aussi préciser le format de la date.

Les différents tags disponibles sont détaillées dans le man:

man date

Sinon pour récupérer la date au format SQL:

date "+%Y-%m-%d %H:%M:%S"

Si on ne veut pas afficher la date courante on peut utiliser l'option -d pour préciser une autre date:

date -d yesterday "+%Y-%m-%d"

Voir les commentaires

Rédigé par Bliz

Publié dans #Script

Repost 0

Publié le 15 Février 2012

J'ai un serveur FTP et je dois effectuer une action à chaque fichier téléchargé (par exemple envoyer une notification).

On pourrait éventuellement scanner le répertoire à intervalle régulier, mais une solution plus simple consiste à se "brancher" sur le fichier de log et de scruter les fichiers uploadés.

Grâce à la commande "tail -f" on peut écrire un petit script shel qui va exécuter une commande à chaque ligne écrite dans un fichier:

#!/bin/sh

tail -f $1 | while read LINE;
do
   NB=$((NB+1))
   echo "$NB: $LINE" 
done

Voilà pour le principe, bon ok, ici le script ne fait que réécrire la ligne du fichier en lui collant un numéro de ligne.

Dans le cas d'un fichier de log d'un server FTP on peut remplacer le corps de la boucle while par une extraction du nom du fichier téléchargé puis appeler un autre programme qui se chargera d'envoyer la notification.

Voir les commentaires

Rédigé par Bliz

Publié dans #Script

Repost 0

Publié le 17 Janvier 2012

find est une commande shell très puissante pour rechercher des fichiers mais souvent on veut effectuer une action sur les fichiers trouvés.

Par exemple on peut effectuer un "grep" pour ne retenir que les fichiers contenant une certaines chaînes de caractères:

find /var/log -name "monApp*.log" | xargs grep "ERROR"

pour n'afficher que les lignes d'erreurs dans tous les fichiers de log de monApp.

Ici on effectue un grep sur chaque fichier retourné à l'aide de xargs.

On peut également spécifier directement la commande à effectuer dans la commande find avec l'option -exec. Mais là la syntaxe est un peu particulière:

find /var/log -mtime +7 -type f -name "*.log" -exec rm -f {} \;

l'option -exec doit être la dernière car tout ce qui suit sera considéré comme faisant parti de la commande à exécuter.

les {} représente le fichier courant et la commande doit se terminer par \;

C'est pas très parlant au premier abord mais ça marche nickel.

Donc ici on efface tous les fichiers de logs de plus de 7 jours présent dans /var/log

Voir les commentaires

Rédigé par Bliz

Publié dans #Script

Repost 0

Publié le 25 Octobre 2011

Le xml est un format très utilisé et beaucoup de services utiilsent ce format pour transmettre des données.

Dans ces cas il arrive très souvent que le xml ne soit pas identé, ce qui permet d'économiser des caractères, mais qui rend les données difficilement exploitable pour le commun des mortels.

Heureusement sous linux il existe un utilitaire qui permet d'indenter automatiquement n'importe quel flux xml.

Il s'agit de xmllint:

Pour formater un fichier xml il suffit de taper la commande suivante:

xmllint --format mon_fichier.xml

On peut même traiter directement un flux provenant d'un service web en spécifiant '-' comme nom de fichier:

wget http://mon.service.web/ | xmllint --format -

Voilà c'est tout simple mais ça simplifie la vie!!

Voir les commentaires

Rédigé par Bliz

Publié dans #Script

Repost 0

Publié le 7 Juillet 2011

Voilà le problème du jour:

 

Je dois afficher le contenu d'un fichier sans la première ligne qui n'est pas des données mais plutôt une en-tête ou un commentaire.

 

La commande tail permet d'effectuer ceci en utilisant une petite astuce:

 

tail -n+2 mes_donnes.csv

 

C'est le '+' qui signifie afficher les lignes à partir de la deuxième.

(Sans le '+' on aurait afficher que les 2 dernières lignes).

Voir les commentaires

Rédigé par Bliz

Publié dans #Script

Repost 0

Publié le 10 Juin 2011

cron permet de lancer des commandes à des heures définies. Toutes les commandes sont définies dans la 'crontab'.

 

On peut utiliser les commandes suivantes pour y accéder:

crontab -l: pour afficher la crontab de l'utilisateur courant

crontab -e: pour editer la crontab de l'utilisateur courant

 

Ces commandes ne permettent pas d'accèder à la crontab principale qui se trouve dans /etc/crontab.

Pour accèder à cette crontab il faut passer directement par un éditeur genre vi: vi /etc/crontab

 

Chaque ligne de la crontab correspond à une commande et s'utlise avec la syntaxe suivante:

0 0 * * * root find /var/log -mtime +7 -type f -name "*.log" -exec rm -f {} \;

| | | | |
| | | | |____ jour de la semaine (dimanche = 0)
| | | |______ mois (de 1 à 12)
| | |________ jour (de 1 à 31)
| |__________ heure (de 0 à 23)
|____________ minute (de 0 à 59)
 

La ligne ci-dessus sera lancé tous les jours à 00:00 en tant que 'root' est effacera tous les fichiers de log de plus de 7 jours.

 

* est un joker qui signifie tous

/ est un caractère spécial qui permet de spécifier un interval par exemple:

*/5 * * * * signifie toutes les 5 minutes

Voir les commentaires

Rédigé par Bliz

Publié dans #Script

Repost 0

Publié le 9 Juin 2011

On peut bien sûr utiliser les flèches haut et bas mais pas très pratique car il faut remonter toutes les commandes une par une.

 

On peut également ouvrir le fichier ~/.bash_history à l'aide d'un "less" ou "vi" et y effectuer une recherche à l'aide du "/" ou du "?".

 

Mais le plus pratique reste la commande <CTRL>+R qui permet de taper la chaine à rechercher.

Pour rechercher les occurences passées il suffit de répéter <CTRL>+R sans entrer de caractères de recherche.

Voir les commentaires

Rédigé par Bliz

Publié dans #Script

Repost 0

Publié le 7 Juin 2011

Cette erreur se produit lorsqu'un script exécuté automatiquement (cron, cgi, etc), donc sans terminal (tty) essaie de lancer une commande en utilisant sudo.

 

Une des restrictions de sudo est qu'il ne peut être qu'utilisé que depuis un terminal.

 

Cette erreur est d'autant plus sournoise que si le script est exécuté depuis un terminal il s'exécute sans problème. Il faut donc bien analyser les fichiers de logs pour trouver cette erreur (encore faut il que l'erreur soit capturée dans les logs).

 

J'utilisé sudo pour lancer une commande avec un autre utilisateur que celui de process appelant.

Dans ce cas j'ai pu contourner le problème en utilisant setuid pour lancer le script directement avec l'utilisateur que je voulais.

 

setuid se met en place de la façon suivante:

 

$ chown <user> mon_script.sh

$ chmod +s mon_script.sh

 

 

lorsque mon_script.sh sera appelé depuis un autre process il sera donc exécuté en tant que <user>.

Voir les commentaires

Rédigé par Bliz

Publié dans #Script

Repost 0

Publié le 10 Mai 2011

Comment extraire les lignes d'un fichier qui ne contiennent pas certains caractères ou la technique du grep inversé.

 

Cette technique permet de nettoyer un fichier "pollué" par des lignes qui ne sont pas intéressantes mais qui gènent l'analyse. C'est souvent très utilsé pour l'analyse de fichier de log (ou certains log reviennent très souvent sans apporter d'information).

 

Pour se faire il suffit d'utiliser la commande grep (qui d'ordinaire permet de ne retenir que les lignes contenant certains caractères) avec l'option -v (pour "inversé").

 

Par exemple, pour enlever toutes les logs contenant le mot DEBUG

 

grep -v DEBUG mon_fichier.log | less

Voir les commentaires

Rédigé par Bliz

Publié dans #Script

Repost 0