[NetBSD/bash] set -C

Le
JKB
Bonsoir à tous,

Dans un script shell, j'ai besoin de mutexes. J'ai donc écrit ceci :

mutex_lock()
{
mutex="$1"

while ! (set -C; echo $$ > "$mutex") > /dev/null 2>&1;
do
if test -n $(cat "$mutex") &&
! kill -0 $(cat "$mutex") > /dev/null 2>&1; then
rm -f "$mutex"
elif test $(cat "$mutex") = $$; then
echo "mutex_lock: we (pid $$) already own mutex $mutex"
fi
sleep 0.1
done
}

mutex_unlock()
{
mutex="$1"

if test -e "$mutex" && test $$ = $(cat "$mutex"); then
rm -f "$mutex"
return 0
fi

if ! test -e "$mutex"; then
echo "mutex_unlock: mutex $mutex does not exist"
return -1
fi

echo -n "mutex_unlock: we (pid $$) do not own mutex $mutex "
echo "(owned by `cat "$mutex"`)"
return -1
}

J'ai pourtant l'impression que ce n'est pas atomique. En tout cas,
ça ne fonctionne pas. Sous Linux, en revanche, ça roule. Je n'ai
pourtant rien vu de spécifique à Linux dans le set -C. Une idée ?

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse
=> http://grincheux.de-charybde-en-scylla.fr
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #25167322
In article JKB
Bonsoir à tous,

Dans un script shell, j'ai besoin de mutexes. J'ai donc écrit ceci :

mutex_lock()
{
mutex="$1"

while ! (set -C; echo $$ > "$mutex") > /dev/null 2>&1;


pourquoi un sous-shell ?


netbsd/bash ? pourquoi bash ? ca a l'air plus ou moins shell posix ton
truc.
JKB
Le #25167422
Le Thu, 24 Jan 2013 18:31:47 +0000 (UTC),
Marc Espie
In article JKB
Bonsoir à tous,

Dans un script shell, j'ai besoin de mutexes. J'ai donc écrit ceci :

mutex_lock()
{
mutex="$1"

while ! (set -C; echo $$ > "$mutex") > /dev/null 2>&1;


pourquoi un sous-shell ?




Quia comme auraient dit mes maîtres jésuites... ;-)

C'est un bout de script que je n'ai pas écrit, qui vient d'un
serveur Linux (qui commence à m'énerver) et que je tente de faire
tourner sous un NetBSD.

netbsd/bash ? pourquoi bash ? ca a l'air plus ou moins shell posix ton
truc.



Parce que plus loin, il y a un tas de basheries pas très nettes qui
ne passent pas avec le sh de NetBSD.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Manuel Bouyer
Le #25167472
JKB
Bonsoir à tous,

Dans un script shell, j'ai besoin de mutexes. J'ai donc écrit ceci :

mutex_lock()
{
mutex="$1"

while ! (set -C; echo $$ > "$mutex") > /dev/null 2>&1;
[...]
J'ai pourtant l'impression que ce n'est pas atomique. En tout cas,
ça ne fonctionne pas. Sous Linux, en revanche, ça roule. Je n'ai
pourtant rien vu de spécifique à Linux dans le set -C. Une idée ?



Je viens de tester sur un 5.1/i386 et ca a l'air de marcher.
Mais pourquoi ne pas utiliser shlock(1) ?

--
Manuel Bouyer NetBSD: 26 ans d'experience feront toujours la difference
--
JKB
Le #25168292
Le Thu, 24 Jan 2013 18:58:54 +0000 (UTC),
Manuel Bouyer
JKB
Bonsoir à tous,



Dans un script shell, j'ai besoin de mutexes. J'ai donc écrit ceci :



mutex_lock()
{
mutex="$1"



while ! (set -C; echo $$ > "$mutex") > /dev/null 2>&1;
[...]
J'ai pourtant l'impression que ce n'est pas atomique. En tout cas,
ça ne fonctionne pas. Sous Linux, en revanche, ça roule. Je n'ai
pourtant rien vu de spécifique à Linux dans le set -C. Une idée ?



Je viens de tester sur un 5.1/i386 et ca a l'air de marcher.
Mais pourquoi ne pas utiliser shlock(1) ?



NetBSD concentrateur-10-0-0-1.xen.localdomain 5.1.2 NetBSD 5.1.2 (CUSTOM)

C'est un NetBSD qui est un domU de Xen, hébergé sur un domO sous
Linux.

Quant à la question pourquoi ne pas utiliser shlock, tout simplement
parce que je ne connaissais pas. Je vais tenter.

Cordialement,

JKB
--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
JKB
Le #25168572
Le Thu, 24 Jan 2013 18:58:54 +0000 (UTC),
Manuel Bouyer
JKB
Bonsoir à tous,



Dans un script shell, j'ai besoin de mutexes. J'ai donc écrit ceci :



mutex_lock()
{
mutex="$1"



while ! (set -C; echo $$ > "$mutex") > /dev/null 2>&1;
[...]
J'ai pourtant l'impression que ce n'est pas atomique. En tout cas,
ça ne fonctionne pas. Sous Linux, en revanche, ça roule. Je n'ai
pourtant rien vu de spécifique à Linux dans le set -C. Une idée ?



Je viens de tester sur un 5.1/i386 et ca a l'air de marcher.
Mais pourquoi ne pas utiliser shlock(1) ?



Trouvé... C'est la lenteur des accès disques de Xen qui ont permit
de voir une race condition dans un script qui tournait depuis
quelques années sur un serveur réel...

D'un côté, ça me ressure un peu, je ne pensais pas NetBSD moisi ;-)

Bon week-end,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Cyrille Lefevre
Le #25188792
Le 25/01/2013 14:00, JKB a écrit :

Trouvé... C'est la lenteur des accès disques de Xen qui ont permit
de voir une race condition dans un script qui tournait depuis
quelques années sur un serveur réel...



Bonjour,

la race condition doit se trouver entre le rm et le création, non ?

perso, j'utilise ln qui est atomique au même titre que mkdir.

https://groups.google.com/forum/#!msg/fr.comp.os.unix/8tabkkyejWU/_P7_Yq3 ZkO8J

manque $FCDATE dans le post :

export LANG=C LC_ALL=C

# localisation de perl
found=0
for perl in /usr/bin/perl /opt/perl*/bin/perl /usr/opt/perl*/bin/perl
/usr/contrib/bin/perl perl5 perl; do
if type "${perl}" > /dev/null 2>&1; then
found=1
break
fi
done

# pas trouve => on sort
if (( found == 0 )); then
echo "$0: perl not found." >&2
exit 1
fi

if [[ $1 = -d ]]; then
shift
exec "${perl}" -le 'print (-e "$ARGV[0]" && -e "$ARGV[1]" ?
(stat($ARGV[0]))[9] - (stat($ARGV[1]))[9] : -1);' "$@"
fi


Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Publicité
Poster une réponse
Anonyme