> > Tu lui donnes un shell, puis un fois son action faite, il le perd ?
> > tu fais comment ?
>
>
> Le pere attend la fin de son fils (et sa descendance),
> et se remet dans son precedent etat. Ex :
> login = attente d'un utilisateur,
> et alors exec de sa "commande", trouvee dans passwd;
> cron = attente de la prochaine seconde,
> "commande(s)" eventuelle(s) dans le(s) crontabs/"utilisateur".
> ...
>
en fait, le processus demon crond (qui tourne en root) lit chaque seconde la
crontab et execute les actions qui doivent l'etre (comme un ps fils)
Dans le repertoire cron.daily un script est charge d'executer le updatedb, ce
script sp'ecifique a redhat je suppose fait les choses suivantes (les
commentaires sont de moi :
#!/bin/bash
#bash est fils de crond
umask=022
#ecriture des fichier avec les droits rw-r--r-- par defaut
die ()
#procedure pour mourir en ecrivant les parametres sur stderr
{
echo "$*" 1>&2
exit 1
}
# on se place sur la racine
cd /
# cree un fichier temporaire (unique)
TMPFILE=`/bin/mktemp /tmp/locatedb.XXXXXX` || {
echo "could not create tempfile" >&2 ; exit 1
}
# donne la propriete de ce fichier a l'utilisateur nobody
chown nobody.nobody $TMPFILE
# alors la on lance un process avec l'identite nobody (su nobody)
# mais au lieu de lancer le shell specifie dans passwd (de toute facon y en a
pas)
# on execute la commande donee a la suite de -c
# cette commande est updatedb qui sera lancee par nobody, qui elle-meme
execute find...
su nobody -c "/usr/bin/updatedb --output=$TMPFILE --localpaths='/'
--prunepaths=
'/tmp /var/tmp /usr/tmp /afs /net' --netpaths='' 2>/dev/null"
# on deplace le fichier temporaire dans /var/lib/locatedb
if [ -f $TMPFILE.n ] ; then
SFILE=$TMPFILE.n
else
SFILE=$TMPFILE
fi
mv $SFILE /var/lib/locatedb || \
die "$0: could not create /var/lib/locatedb"
# on le rend a root (il appartenait a nobody)
chown root.root /var/lib/locatedb || \
die "$0: could not change ownership of /var/lib/locatedb"
rm -rf $TMPFILE $TMPFILE.n
#on sort bienheureux !!!
exit 0
-----------------------------------------------------------------------------
La hierarchie des process lancee est donc
crond (root)
|-> /etc/cron.daily/updatedb.cron (root)
|-> /usr/bin/updatedb (nobody)
|-> find (nobody)
Voili, j'espere que tout le monde a compris :)
cordialement.