lundi 25 janvier 2016

Linux, pidof pour vérifier qu'un script n'est pas en train de s'exécuter avant d'en lancer une nouvelle instance

Il arrive parfois que plusieurs instances du même programme ne doivent pas être exécutées simultanément. Par exemple pour assurer l'intégrité des ressources utilisées.
Dans ce cas, il est indispensable au démarrage du programme de vérifier qu'une autre instance n'est pas déjà en cours d'exécution.

Dans le cas de scripts bash très utiles pour automatiser certaines tâches il existe une solution simple et fiable : utiliser la commande pidof.

De façon générale la commande pidof nomprocess sert à retrouver les identifiants de tous les process portant le nom nomprocess.

Par défaut, cette commande ne prend pas en compte les scripts shell.
Pour corriger cela, il faut lui ajouter l'option -x de la façon suivante : pidof -x nomscript

Si dans le script nommé monscript j'utilise pidof -x monscript je vais bien récupérer les identifiants des éventuelles autres instances de monscript mais aussi celui de l'instance courante.
L'option -o identifiant_à_omettre permet de remédier à cela. En effet, cette option indique à pidof de ne pas retourner l'identifiant identifiant_à_omettre.
Sous bash, la variable $$ contient l'identifiant du script courant.
Donc, la commande pidof -x -o $$ monscript renvoie bien les identifiants de toutes les instances de monscript sauf celui de l'instance courante.

Pour être sûr que plusieurs instances de monscript ne soient pas exécutées en même temps, celui ci peut donc être écrit de la façon suivante :

#!/bin/bash
# dum verifie qu'il n'y a pas d'autres instances du script en cours d'execution
dum=$(pidof -x -o $$ monscript)
if test -z "$dum"
then
   actions à effectuer
fi

jeudi 24 septembre 2015

Find et wc pour calculer le nombre de lignes de code dans un projet Php

Je sors tout juste d'une longue période de refactoring d'anciennes applications Php et je me suis demandé combien de lignes de codes étaient impliquées dans certains projets.
J'ai obtenu la réponse assez facilement en combinant l'utilisation des deux commandes find et wc de la façon suivante :

find racinedemonprojet -type f -name "*.php" -exec wc -l {} \; > ~/resultat.txt

Find explore de manière récursive l'arborescence de dossiers à partir de racinedemonprojet à la recherche de tous les fichiers portant l'extension .php.
Chaque fichier trouvé est ensuite analysé par la commande wc -l qui affiche le nombre de lignes du fichier ainsi que son nom.

A la fin j'obtiens un fichier resultat.txt qui comporte autant de lignes qu'il y a de fichiers Php dans mon projet et qui indique pour chacun d'eux le nombre de lignes qu'il contient.
Il suffit donc d'ouvrir ce fichier avec un tableur et de faire la somme des valeurs de la première colonne pour connaitre le nombre total de lignes de codes Php dans le projet.

dimanche 23 août 2015

Migrer vers Php 5.4 depuis une version antérieure

On sait depuis quelques mois qu'Ovh va rendre obsolètes sur ses hébergements mutualisés toutes les versions de Php antérieures à 5.4.

Cela fait un peu plus de 15 ans que je développe des sites et des applications internet basées sur ce langage. Certaines tournent sur des serveurs locaux mais la plupart sont sur des hébergements mutualisés ou sur des VPS chez Ovh.
Pour les mutualisés on sait qu'ils passeront automatiquement à Php 5.4 en septembre.
Pour les VPS rien n'est annoncé concernant les serveurs en production mais pour les nouveaux, les distributions proposées semblent disposer au moins de Php 5.5.

Si mes scripts les plus récents sont déjà en Php 5.5, il en reste un certain nombre dans des versions antérieures et même en Php 4. Il adonc bien fallu que je me penche sérieusement sur le sujet et voici une petite liste non exhaustive des principaux changements et des choses à vérifier/corriger lorsque l'on migre vers Php 5.4 depuis une version antérieure.

  • La directive register_globals disparaît :

    A mon avis c'est le changement le plus important si vous ne l'avez pas anticipé. Il y a longtemps la valeur par défaut de register_globals était On. Avec Php 4.2 cette valeur par défaut est passée à Off mais jusqu'à la version 5.3 on pouvait encore la changer pour mettre à On. Depuis Php 5.4 cette directive disparaît et Php se comporte automatiquement comme si elle valait Off.
    Donc si malgré tous les avertissements à ce sujet vous avez encore des scripts dont les variables sont automatiquement initialisées avec les paramètres (GET ou POST) de la requête qui les appelle, ils ne vont plus fonctionner en Php 5.4.

  • Les magic_quotes disparaissent :

    Cela concerne aussi bien les magic_quotes_gpc que les magic_quotes_runtime donc pensez bien à vérifier comment sont traités les guillemets simples ou doubles dans vos données externes.

  • Attention à l'encoding des fonctions du type htmlspecialchars :

    Les principales fonctions concernées sont htmlspecialchars, htmlspecialchars_decode, html_entities, html_entity_decode, get_html_translation_table et il faut bien reconnaître que l'évolution de la valeur par défaut du paramètre optionnel encoding a de quoi prêter à confusion.

  • Obsolescence annoncée de l'extension MySQL :

    Si vous utilisez encore l'ancienne extension MySQL pour accéder à vos bases de données, il est grand temps de passer à MySQLi car MySQL est obsolète à partir de Php 5.5 et sera supprimée prochainement.