Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/07/2008, 16h37   #1
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 88
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 88
Points : 33
Points : 33
Par défaut Difference shell entre Linux, HP-UX et SunOS

Bonjour,

J'ai créée un script shell qui fonctionne parfaitement sous Linux, mais qui ne marche pas sous HP-UX et SunOS.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/bin/bash
#set -x
################################################################################
#
# Nom:          check_fs.sh
# Description:  Renvoi pour le FS monte le plus rempli, le nom de celui ci
# pour le parametre "name", le pourcentage d'occupation pour le parametre
# "used" et l'espace libre pour le parametre "free"
#
################################################################################
 
# On recupere le type de systeme sur lequel on est dans une variable
OS=`uname -s`
# On recupere le chemin du fichier des FS a ne pas monitorer
fichier="liste"
# On recuperer le chemin du fichier des fichiers a monter (fstab)
case $OS in
        SunOS)
                mountfic="/etc/vfstab";;
        *)
                mountfic="/etc/fstab"
esac
 
################################################################################
#
# Nom:          montage()
# Description:  Retourne 1 si tous les FS devant etre monte au demarrage sont
# montes, 0 sinon...
#
################################################################################
 
function montage()
{
# On envoi le resultat de la commande dans le fichier temporraire 'fic'
df > fic
# On fait un premier parcours pour les entrees de 'fstab' ayant pour type de FS "ext2/ext3/ufs/hfs/vxfs/tmpfs/psfs"
cat $mountfic |egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{ print $2}' | while read ligne
do
 
#on fait un parcours imbrique en lisant le fichier 'fic' contenant le resultat de la commande 'df'
cat fic | awk '{ print $6}' | while read l
        do
                # On regarde si le FS de fstab est compris dans fic, ce qui voudrait dire qu'il est bien monte
                i=$(cat $fic | grep -w $ligne | wc -l)
                # Si c'est pas le cas alors on met a la fin d'un fichier temporaire 'result' 0 sinon on met 1
                if test $i -eq 0
                then
                        echo 0 >> result
                else
                        echo 1 >> result
                fi
        done
done
 
# S'il y a un 0 dans 'result' c'est qu'il y a eu un FS qui n'est pas monte, et donc on retourne 0 sinon on retourne 1
if test $(cat result | grep -w 0 | wc -l) -eq 0
then
        echo 1
else
        echo 0
fi
 
# On efface le contenu de 'result'
rm result
}
 
# On verifie que le fichier des FS exclus existe
if test -e $fichier
then
	function listeFS()
	{
	cat $1 | while read l
	do
		var=$var"|"$l
		echo $var > monfic
	done
 
	cat monfic | sed 's/|//' monfic
	rm monfic
	}
 
	listeFS=$(listeFS $fichier)
else
#	listeFS="pasDeFichier"
	echo "fichier inexistant"
	exit 
fi
 
 
################################################################################
#
# Nom:          main
#
################################################################################
 
case $OS in 
 
	Linux) 
 	#FS monitoring
		name=`df -PT | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | sort -r -n -k 6 |awk '{ print $7}'|egrep -w -v $listeFS| head -1`
		case $1 in
 
		name)
			commande=$name;;
		used)
			commande=`df -PT | egrep -w $name | awk '{ print $6}' | sed "s/%//g"`;;
		free)
			commande=`df -PT | egrep -w $name | awk '{ print $5}' | sed "s/%//g"`;;
		mount)
			commande=$(montage);;
		esac;;
	HP-UX)
	# FS monitoring
		name=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}'  | xargs df -P |sort -r -n -k 5 | awk '{ print $6}' | grep -v $listeFS | head -1`
		case $1 in
 
		name)
			commande=$name;;
		used)
			commande=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}'  | xargs df -P | grep -w $listeFS |awk '{ print $5}' |sed "s/%//g"`;;
		free)
			commande=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}'  | xargs df -P | grep -w $listeFS |awk '{ print $4}'`;;
		mount)
			commande=$(montage);;
		esac
		;;
 
	Solaris)
	# FS monitoring
		name=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}' | xargs df -k | sort -r -n -k 5 | awk '{ print $6}' | grep -w -v $listeFS | head -1`
		case $1 in
		name)
			commande=$name;;
		used)	
			commande=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}'  | xargs df -k |sort -r -n -k 5 |head -1 |awk '{ print $5}' |sed "s/%//g"`;;
		free)	
			commande=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}'  | xargs df -k |sort -r -n -k 5 |head -1 |awk '{ print $5}' |sed "s/%//g"`;;
		mount)	
			commande=$(montage);;
		esac
		;;
 
esac
 
echo $commande
Je voudrais savoir s'il y a beaucoup de differences entre le shell de ces 3 OS ? Est ce que la declaration de fonction varie d'un OS a l'autre ? Car ca me met une erreur a la declaration de ma premiere fonction...
ChrisMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2008, 11h27   #2
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 5 502
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : R&D en systemes informatiques bas niveau Unix/Linux

Informations forums :
Inscription : mai 2004
Messages : 5 502
Points : 9 685
Points : 9 685
Bonjour,

Je crains que ton script ne fonctionne pas du tout parfaitement sous Linux...

Voici ce que fait ton script, si on enlève tout le superflu :

Il alloue 3 variables : OS, fichier et mountfic
Il teste la présence de $fichier dans le répertoire courant.

Dommage, je n'ai pas de fichier appelé 'liste' dans le répertoire courant, donc il sort en erreur. Cela est indépendant du système.

Essaie de reprendre ton script pour corriger cette erreur, et je pense que tout devrait fonctionner.
__________________
Modérateur "C", "Informatique Générale & Hardware" et "Unix"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2008, 14h53   #3
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 88
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 88
Points : 33
Points : 33
De quelle erreur parles tu ?

En tout cas sous mon Linux, ce script marchait sans problemes, depuis je l'ai modifié et il marche parfaitement sous Linux et HP-UX mais toujours pas sous SunOS !

Ce qui marchait pas venait du "bash" que j'utilisais, comme je le pressentais pour la declaration des fonctions, la declaration que je faisais qui marchait sous Linux ne marche pas sous HP-UX, en revanche j'ai pu remarquer avec ce script que tout ce qui marchait sur HP-UX marchait sur Linux mais pas le contraire, je sais pas si c'est une generalité...

Mon fichier "liste" n'est qu'un fichier de test, ou je met un nom de FS sur une ligne, par exemple :
/
/var

Juste pour voir si mes commandes marchent bien, car le script retourne le FS monté le plus rempli, mais certains FS ne sont pas a monitorer, donc si jamais le + remplit est un de ces FS (qui doit se trouver dans un fichier externe), alors on prend le deuxieme ainsi de suite...

Voila mon script un peu modifié, je sais pas encore quel est le probleme sous SunOS, pour l'instant j'essaye de faire marcher des commandes sur SunOS (j'ai ouvert un autre post) avec lesquelles j'ai un peu de mal...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#!/bin/sh
#set -x
################################################################################
#
# Nom:          check_fs.sh
# Description:  Renvoi pour le FS monte le plus rempli, le nom de celui ci
# pour le parametre "name", le pourcentage d'occupation pour le parametre
# "used" et l'espace libre pour le parametre "free"
#
################################################################################
 
# On recupere le type de systeme sur lequel on est dans une variable
OS=`uname -s`
# On recupere le chemin du fichier des FS a ne pas monitorer
fichier="liste"
# On recuperer le chemin du fichier des fichiers a monter (fstab)
case $OS in
        SunOS)
                mountfic="/etc/vfstab";;
        *)
                mountfic="/etc/fstab";;
esac
 
################################################################################
#
# Nom:          montage()
# Description:  Retourne 1 si tous les FS devant etre monte au demarrage sont
# montes, 0 sinon...
#
################################################################################
 
if [ "$1" = "mount" ]
then
 
#function montage()
montage()
{
# On envoi le resultat de la commande dans le fichier temporraire 'fic'
case $OS in
        Linux)
                df > fic;;
        HP-UX)
                mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}'  | xargs df -P > fic;;
	SunOS)
		mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}' | xargs df -k > fic;;
esac
 
# On fait un premier parcours pour les entrees de 'fstab' ayant pour type de FS "ext2/ext3/ufs/hfs/vxfs/tmpfs/psfs"
cat $mountfic |egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{ print $2}' | while read ligne
do
 
#on fait un parcours imbrique en lisant le fichier 'fic' contenant le resultat de la commande 'df'
cat fic | awk '{ print $6}' | while read l
        do
                # On regarde si le FS de fstab est compris dans fic, ce qui voudrait dire qu'il est bien monte
                # Si c'est pas le cas alors on met a la fin d'un fichier temporaire 'result' 0 sinon on met 1
                if test `cat $fic | grep -w $ligne | wc -l` -eq 0
                then
                        echo 0 >> result
                else
                        echo 1 >> result
                fi
        done
done
 
# S'il y a un 0 dans 'result' c'est qu'il y a eu un FS qui n'est pas monte, et donc on retourne 0 sinon on retourne 1
if test `cat result | grep -w 0 | wc -l` -eq 0
then
        echo 1
else
        echo 0
fi
 
# On efface le contenu de 'result'
rm result
}
 
fi
 
# On verifie que le fichier des FS exclus existe
if test -e $fichier
then
#	function listeFS()
	listeFS()
	{
	cat $1 | while read l
	do
		var=$var"|"$l
		echo $var > monfic
	done
 
	cat monfic | sed 's/|//' monfic
	rm monfic
	}
 
	listeFS=`listeFS $fichier`
else
#	listeFS="pasDeFichier"
	echo "fichier inexistant"
	exit 
fi
 
 
################################################################################
#
# Nom:          main
#
################################################################################
 
case $OS in 
 
	Linux) 
 	#FS monitoring
		name=`df -PT | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | sort -r -n -k 6 |awk '{ print $7}'|egrep -w -v $listeFS| head -1`
		case $1 in
 
		name)
			commande=$name;;
		used)
			commande=`df -PT | egrep -w $name | awk '{ print $6}' | sed "s/%//g"`;;
		free)
			commande=`df -PT | egrep -w $name | awk '{ print $5}' | sed "s/%//g"`;;
		mount)
			commande=`montage`;;
		esac;;
	HP-UX)
	# FS monitoring
		name=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}'  | xargs df -P |sort -r -n -k 5 | awk '{ print $6}' | grep -vw $listeFS| head -1`
		case $1 in
 
		name)
			commande=$name;;
		used)
			commande=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}'  | xargs df -P | grep -w $name |awk '{ print $5}' |sed "s/%//g"`;;
		free)
			commande=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}'  | xargs df -P | grep -w $name |awk '{ print $4}'`;;
		mount)
			commande=`montage`;;
		esac
		;;
 
	SunOS)
	# FS monitoring
		name=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}' | xargs df -k | sort -r -n -k 5 | awk '{ print $6}' | grep -w -v $listeFS | head -1`
		case $1 in
		name)
			commande=$name;;
		used)	
			commande=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}'  | xargs df -k |sort -r -n -k 5 |head -1 |awk '{ print $5}' |sed "s/%//g"`;;
		free)	
			commande=`mount -v | egrep "ext2|ext3|ufs|hfs|vxfs|tmpfs|psfs" | awk '{print $3}'  | xargs df -k |sort -r -n -k 5 |head -1 |awk '{ print $5}' |sed "s/%//g"`;;
		mount)	
			commande=`montage`;;
		esac
		;;
 
esac
 
echo $commande
ChrisMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 10h56   #4
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 88
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 88
Points : 33
Points : 33
Il y a apparement quelques differences au niveau des options de certaines commandes, mais aussi des differences entre les versions elles memes de Solaris... Sinon problemes resolus...
Merci encore !
ChrisMan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h51.


 
 
 
 
Partenaires

Hébergement Web