Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[NetBSD/bash] set -C

6 réponses
Avatar
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

6 réponses

Avatar
espie
In article ,
JKB wrote:
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.
Avatar
JKB
Le Thu, 24 Jan 2013 18:31:47 +0000 (UTC),
Marc Espie écrivait :
In article ,
JKB wrote:
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
Avatar
Manuel Bouyer
JKB wrote:
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
--
Avatar
JKB
Le Thu, 24 Jan 2013 18:58:54 +0000 (UTC),
Manuel Bouyer écrivait :
JKB wrote:
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
Avatar
JKB
Le Thu, 24 Jan 2013 18:58:54 +0000 (UTC),
Manuel Bouyer écrivait :
JKB wrote:
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
Avatar
Cyrille Lefevre
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.