Script au démarrage

Bonjour à tous,

J’ai un p’tit problème que vous allez sûrement pouvoir résoudre.

Suis en train d’apprendre la gestion des scripts au démarrage et des runlevels. Et je me suis mis en tête de réaliser un script de mise à jour automatique. J’explique : Dans le fichier /etc/init.d/rc.local je monte un répertoire NFS situé sur une des machines du réseau, lequel contenant un script A. Ce script A appel d’autres scripts correspondants aux machines qui sont lancées (B pour la machine B, C pour ma machine C, G1 pour le groupe de machine G1, etc.). Les scripts se lancent bien, pas de soucis de ce côté-là. Par contre, quand je veux lancer une install à partir du script (par exemple apt-get install --force-yes geany) ça ne fonctionne pas (sauf le reste du script). Si je lance le script manuellement par contre ça fonctionne.

Le “Default-Start” de rc.local est 2 3 4 5

A votre avis, d’où vient le problème ? (En espérant avoir été clair dans les explications :blush: )

Merci d’avance :slightly_smiling:

[quote=“sapristi”]…Dans le fichier /etc/init.d/rc.local je monte un répertoire NFS …[/quote]“Pas glop!”, car pour mounter des systèmes de fichiers il y a “/etc/fstab”, et pour le reste :

[quote="/etc/init.d/rc.local"]… # Short-Description: Run /etc/rc.local if it exist …[/quote] donc “/etc/init.d/rc.local” est un script qui va lancer (s’il existe) le script “/etc/rc.local”.

Voir “11.5” et “11.6” dans cette page

debian init updaterc-d

=======
“apt-get install --force-yes geany”, ça peut marcher à condition que la variable PATH de l’environnement d’exécution du script permette de trouver l’application “apt-get”, sinon il vaudra mieux utiliser le chemin absolu de la commande : “/usr/bin/apt-get install --force-yes geany”.

Merci pour ta réponse et tes conseils.

Mea Culpa pour le montage pas glop. Je vais utiliser autofs :wink:

Bon j’ai refais un truc propre. Pour éviter de mettre le bazar dans les scripts existants, plutôt que d’écrire dans rc.local j’ai créé un script à part. Runlevel 2 3 4 5.

Maintenant, je vois où ça coince mais je ne sais pas pourquoi. Sûrement une erreur de débutant au niveau du codage.

Si dans mon script je mets simplement la commande “apt-get install nom_paquet” : ça fonctionne.

Par contre, si je fais ça :

PATH=/bin:/usr/bin

paquets=("geany" "vim" "ghex")

for i in ${!paquets[@]}
do
        # pour voir si on rentre dans la boucle for
        touch /tmp/passfor
	
        if apt-cache policy ${paquets[i]} | grep aucun
	then 
		apt-get -y --force-yes install ${paquets[i]}
                touch /tmp/aptok
	fi
done

… ça ne fonctionne pas. La boucle FOR se fait bien, mais pas le IF. Par contre, si je lance le script dans un terminal : aucun problème, ça installe tout :open_mouth:

Question : Mais quoi qui n’a t-il bien pu ne pas aller ??

[code]PATH=/bin:/usr/bin

paquets=(“geany” “vim” “ghex”)

for paquetage in ${paquets[@]}
do
apt-cache policy ${paquetage} | grep aucun & > /dev/null
if [ $? == 0 ]; then
echo “${paquetage} n’est pas installé.”
#apt-get -y --force-yes install ${paquetage}
fi
done

& > /dev/null => permet de rediriger les messages de “stdout” vers “/dev/null”,

donc, les messages de sortie de “grep” ne seront pas affichés.

$? => code de retour de la dernière commande qui vient juste d’être exécutée,

donc, si “grep” a trouvé le mot “aucun” alors code de retour de “grep” est 0.

[/code]
Si ça te va, il suffit de décommenter la ligne “apt-get …” et de commenter la ligne “echo …” juste au dessus

Je débute en “bash”, il y a sûrement mieux à faire, alors peut-être (j’espère même) que des conseils/rectifications vont être proposées…

Merci pour ton aide, mais malheureusement ça ne fonctionne toujours pas : le IF ne passe pas si le script est lancé au démarrage.

Dans ton code, ${paquetage} n’est pas la bonne syntaxe : cela renvoi le numéro de la boucle FOR en cours. Il faut bien écrire ${paquets[paquetage]}.

En tout cas, j’y comprends toujours rien :confused: Si tu as d’autres idées…

À ajouter dans “/etc/rc.local” (avant “exit 0”)

set +e listeDesPaquets="geany vim ghex"; for paquetage in $listeDesPaquets; do /usr/bin/apt-cache policy $paquetage | /bin/grep "none" && apt-get -y --force-yes install $paquetage; done; set -e

Mettre à jour automatiquement sa Debian n’est clairement pas anodin, rassure moi c’est un desktop ?

Script clairement pas à proposer sur un serveur afin de pouvoir contrôler au plus près les mises à jour (une régression ou un souci post mise à jour est toujours possible).

Entièrement d’accord avec toi Clochette, mais je ne fais que répondre à la demande,
et en plus peut-être très mal car comme je le précisais je ne suis qu’un débutant en programmation bash.

Vu les application à installer, je pense qu’il doit s’agir de desktops avec interfaces graphiques, où alors…

Clochette : Ce sont des configs Desktop. En aucun cas il s’agit de mettre un serveur à jour automatiquement. Le but est seulement de pouvoir (entre autre) installer automatiquement et à la demande des paquets sur un parc de machines, plutôt que de passer sur chacune d’entre-elles.

MicP : je test ta solution la semaine prochaine :wink:

[quote=“sapristi”]Clochette : Ce sont des configs Desktop. En aucun cas il s’agit de mettre un serveur à jour automatiquement. Le but est seulement de pouvoir (entre autre) installer automatiquement et à la demande des paquets sur un parc de machines, plutôt que de passer sur chacune d’entre-elles.

MicP : je test ta solution la semaine prochaine :wink:[/quote]

Si j’ai le temps ce soir je te proposerai une commande pour tester la présence de mise à jour disponible, mais si tu administre un parc de machine puppet et l’outil idéal pour lancer de façon automatisé des mises à jour via un manifest.

http://fr.wikipedia.org/wiki/Puppet

Bonjour,

Je refais surface car pas mal occupé ces derniers temps. J’ai testé ton code MicP, et ça marche ! Pourquoi je ne sais pas, mais ça marche !!

Merci de ton aide :slightly_smiling:

@+!