Récupérer un paramètre oracle sur plusieurs serveurs en ksh sous Linux

En mode sysadmin

Etant dans une équipe d’intégration, j’ai besoin de lancer souvent de petits scripts maison, telle une sysadmin. Je ne fais pas de dev à proprement parler, j’ai juste besoin d’un résultat rapide et efficace. Mon script n’a pas besoin d’être générique ou d’avoir un max de contrôles, c’est du « ONE SHOT » en quelque sorte.

Comment je procède ?

Dans un premier temps, comme tout sysadmin, je teste d’abord le script sql en local sur les machines.

Dans un second temps, je lance le script à distance toujours en ligne de commande.

Enfin, je crée un script ksh de quelques lignes qui contiendra tout ce dont j’ai besoin : liste des serveurs, script SQL, résultat affiché sur la console.

Je vous laisse découvrir le script ci-dessous, testé et approuvé sur des bases Oracle 11g :)

#!/usr/bin/ksh

for i in server1 server2 server3 server4 server5
do
ssh -T $i <<EOF
echo $i
#amélioration de l'affichage, 200 caractères par ligne
echo "set linesize 200 " > /tmp/scriptOracle.sql
echo "show parameter parallel_max_servers" >> /tmp/scriptOracle.sql
#se déconnecter de la base
echo "exit" >> /tmp/scriptOracle.sql
#sourcer le ficher d'environnement Oracle, lancer le  script sql créé juste en haut et récupérer uniquement la ligne qui nous intéresse
        su - oracle -c ". /chemin/fichierParamOracle  ; sqlplus / as sysdba @/tmp/scriptOracle.sql" 2>/dev/null | grep parallel_max_servers
EOF
done

Résultat : 
monPrompt> ./scriptOracle.ksh
server1
parallel_max_servers                 integer                          xxx
server2
parallel_max_servers                 integer                          xxx
server3
parallel_max_servers                 integer                          xxx
server4
parallel_max_servers                 integer                          xxx
server5
parallel_max_servers                 integer                          xxx
Petit script de sysadmin

Créer un menu basique avec la commande select en ksh

En ksh, vous pouvez afficher un menu et ainsi proposer à un utilisateur de faire un choix. Rien ne vaut un exemple :

PS3= »Choisissez un film : « 
select REPLY in scream awake
do
       case $REPLY in
       scream)  echo « Type : film comique » ; break ;;
       awake)  echo « Type : thriller » ; break ;;
      *) echo « Erreur » ; exit 1;;
       esac
done

# ajout d’un traitement suivant le choix de l’utilisateur

Le résultat est le suivant :

[fatiha@monServeur]  ./selectEnKsh.ksh
1) scream
2) awake
Choisissez un film : 2
Type : thriller
[fatiha@monServeur]   ./selectEnKsh.ksh
1) scream
2) awake
Choisissez un film : 3
Erreur
[fatiha@monServeur] ./selectEnKsh.ksh
1) scream
2) awake
Choisissez un film : 2
Type : thriller

Pour plus d’infos => Google :)

Mise à jour :

On verra dans un prochain article une commande bien plus intéressante : dialog.

Linux : Extraction de colonnes avec la commande cut

Vous avez un fichier de logs à analyser et avez besoin d’extraire des colonnes bien précises. Tout ceci bien sûr en une ligne de commande sous Linux. Ceci est possible avec la commande cut.

Prenons tout de suite l’exemple d’un fichier de logs avec des colonnes séparées par des tirets. Le tiret est donc notre délimiteur. Nous souhaitons extraire les colonnes 2 et 4.

Aperçu du fichier à analyser :

champ1 – champ2 – champ3 – champ4 – champ5 – champ6

La ligne de commande sera :

cut -d’-‘ -s -f2,4 monFichier.log > fichierResultat

Analyse de la ligne de commande :

  • option -d pour indiquer quel est le délimiteur
  • option -s pour supprimer les lignes ne contenant pas le délimiteur
  • option -f pour spécifier les champs à extraire
  • monFichier.log : le fichier à analyser
  • fichierResultat : fichier qui va contenir les champs extraits

Pour en savoir plus :

man cut

Séquence howto du jour : Fonctions en ksh

Comment coder une fonction en ksh sous Linux ? Quelle est la syntaxe à utiliser ?

Pour définir une fonction en ksh on utilise les mots-clés suivants :

function myFunction

{

#code of my function

}

L’appel se fait de plusieurs manières, j’ai choisi celle-ci :

`myFunction`

Assez discuté, passons à un cas pratique. J’ai un fichier de logs à analyser. Je veux récupérer le nombre de fois que les expressions ERROR, WARNING et INFO apparaissent.

#!/bin/ksh

# prend en paramètre une chaîne de caractères
# ici c'est une expression qui doit être recherchée dans un fichier de logs
function returnNumber
{
 # $1 est le paramètre passé à la fonction
 pattern=$1
 number=`grep -c "${pattern}" test.log`
 echo ${number}
}

# on appelle la fonction avec des anti-quotes
# et en paramètre le pattern à rechercher dans le fichier de logs
echo "`returnNumber ERROR` fois ERROR"
echo "`returnNumber WARNING` fois WARNING"
echo "`returnNumber INFO` fois INFO"

J’exécute le script :

Pour en savoir plus sur les fonctions en ksh :