Dach Premièrement, est-ce que quelqu'un se souvient du nom de cet outil qui somme la première colonne d'un fichier ? genre "du -sb /tmp | summit". Deuxième problème... J'ai un partage nfs:/usr/share/bidule que je monte sur plusieurs machines sous /usr/share/bidule. Bon. Dans ce répertoire, j'ai des binaires, des trucs de confs, etc... J'ai un script nfs:/usr/share/bidule/install.sh qui se charge de recréer les liens entre le fs et le share. Bon bon bon... J'essaie maintenant, à partir du install.sh, de faire une "copie de sauvegarde" de nfs:/usr/share/bidule sous file:/usr/share/bidule de sorte que, si le montage se met à foirer, j'ai toujours mes fichiers et liens accessibles sous /usr/share/bidule. Je sais pas si vous voyez bien ce que je veux dire. En fait, j'utilise la propriété de "hider" une hierarchie de fichiers avec un mount sur le noeud root. Toujours est-il que, le script étant lancé à partir de nfs:/usr/share/bidule, il râle au moment de umount le share. Un chdir au début du script ne change rien. J'ai essayé en faisant une copie de $0 dans $HOME, puis en le lançant avec un "exec -a my_son $HOME/install.sh" et test dans install.sh pour voir d'où il est appelé, mais le -a ne fonctionne pas comme je le pensais (donnant même l'impression qu'il ne fonctionne pas du tout). Au final, j'ai essayé en faisant un "cat <<END > $HOME/2nd_stage.sh" suivi du script umount/remount, et différentes façons de lancer ce nouveau script: exec, bash, en background, etc... Rien n'y fait. Quand je veux umount, j'ai toujours un "busy" sur le mountpoint. Ma question est donc la suivante: comme faire ? :-) Je répète donc l'idée: lancer un script hébergé sur un mount, et au sein de ce script (ou d'un fils), démounter le partage, faire 2, 3 trucs, puis le remonter. Maaarzi pj
Philippe Jacquot wrote:
Dach
Premièrement, est-ce que quelqu'un se souvient du nom de cet outil qui somme la première colonne d'un fichier ? genre "du -sb /tmp | summit".
je crois ne pas avoir compris la question mais ... du -sb /tmp | awk '{ sum+=$1 } END { print sum }' ?
Je répète donc l'idée: lancer un script hébergé sur un mount, et au sein de ce script (ou d'un fils), démounter le partage, faire 2, 3 trucs, puis le remonter.
je ne crois pas que tu puisse. pe essayer un truc du genre : fin=/tmp/fin echo ' #!/bin/sh umount /mondev echo still here umount /mondev rm '$fin > $fin chmod +x $fin exec $fin mais c'est que ce que tu as voulu faire avec exec ? non ? mc
Marc Chantreux a écrit :
Philippe Jacquot wrote:
Dach
Premièrement, est-ce que quelqu'un se souvient du nom de cet outil qui somme la première colonne d'un fichier ? genre "du -sb /tmp | summit".
je crois ne pas avoir compris la question mais ...
du -sb /tmp | awk '{ sum+=$1 } END { print sum }'
?
Ouais mais non, ça c'est aussi ce que je fais en attendant. :-)
Je répète donc l'idée: lancer un script hébergé sur un mount, et au sein de ce script (ou d'un fils), démounter le partage, faire 2, 3 trucs, puis le remonter.
je ne crois pas que tu puisse. pe essayer un truc du genre :
fin=/tmp/fin echo ' #!/bin/sh umount /mondev echo still here umount /mondev rm '$fin > $fin chmod +x $fin exec $fin
mais c'est que ce que tu as voulu faire avec exec ? non ?
Toutafé: cat <<END > $HOME/sparx_install.$$.sh #!/bin/bash (bla bla bla ...) echo finished ! END chmod u+x $HOME/sparx_install.$$.sh exec $HOME/sparx_install.$$.sh & exit Essayé avec exec, exec -a, bash, ou même directement, en commande. Rien n'y fit. Je trouve un peu zarb qu'on ne puisse pas faire lancer un process puis libérer toutes les ressources occupées par le premier process. J'imagine que le fils hérite du /usr/share/sparx/install.sh ouvert par le père, mais je le trouve nulle part dans /proc/$$/fd Donc, au secours. :-) pj
mc _______________________________________________ Shell mailing list Shell@lists.asyd.net http://lists.asyd.net/mailman/listinfo.cgi/shell
Philippe Jacquot wrote:
du -sb /tmp | awk '{ sum+=$1 } END { print sum }' Ouais mais non, ça c'est aussi ce que je fais en attendant. :-)
ben c'est tres bien ca ... pourquoi chercher autre chose ?
Je trouve un peu zarb qu'on ne puisse pas faire lancer un process puis libérer toutes les ressources occupées par le premier process. J'imagine que le fils hérite du /usr/share/sparx/install.sh ouvert par le père, mais je le trouve nulle part dans /proc/$$/fd
Donc, au secours. :-)
je compatis et partage ton sentiment d'étrangeté, c'est malheureusement la seule chose que je puisse faire :( mc
Marc Chantreux a écrit :
Philippe Jacquot wrote:
du -sb /tmp | awk '{ sum+=$1 } END { print sum }'
Ouais mais non, ça c'est aussi ce que je fais en attendant. :-)
ben c'est tres bien ca ... pourquoi chercher autre chose ?
Parce que cette commande existe et que je l'ai déjà utlisée. :-)
Je trouve un peu zarb qu'on ne puisse pas faire lancer un process puis libérer toutes les ressources occupées par le premier process. J'imagine que le fils hérite du /usr/share/sparx/install.sh ouvert par le père, mais je le trouve nulle part dans /proc/$$/fd
Donc, au secours. :-)
je compatis et partage ton sentiment d'étrangeté, c'est malheureusement la seule chose que je puisse faire :(
Viel danke.
mc _______________________________________________ Shell mailing list Shell@lists.asyd.net http://lists.asyd.net/mailman/listinfo.cgi/shell
ben c'est tres bien ca ... pourquoi chercher autre chose ? Parce que cette commande existe et que je l'ai déjà utlisée. :-)
perso, j'essaie tjrs de minimiser le nombre de dépendances à des commandes externes. mes 2 centimes ... par contre : la réponse au problème m'intéresse beaucoup. quand tu l'auras trouvée :) mc
Marc Chantreux a écrit :
ben c'est tres bien ca ... pourquoi chercher autre chose ?
Parce que cette commande existe et que je l'ai déjà utlisée. :-)
perso, j'essaie tjrs de minimiser le nombre de dépendances à des commandes externes.
Vi mais là c'était pas pour un script, mais en CLI :-)
mes 2 centimes ...
par contre : la réponse au problème m'intéresse beaucoup. quand tu l'auras trouvée :)
Promis, juré, craché, rrRR.. ptiou.. ptiou..
mc _______________________________________________ Shell mailing list Shell@lists.asyd.net http://lists.asyd.net/mailman/listinfo.cgi/shell
On 2/23/06, Philippe Jacquot <philippe.j@sparx.com> wrote:
Je répète donc l'idée: lancer un script hébergé sur un mount, et au sein de ce script (ou d'un fils), démounter le partage, faire 2, 3 trucs, puis le remonter.
Si j'ai compris le fond du problème : tu lances un script et tu veux ensuite démonter l'endroit ou est ce script, donc ca rale ? Une idée (pas testée) est-ce que ca change quelque chose si tu "forkes" ton script ? Le probleme est que le script "utilise" un repertoire, mais si le script se finit, ca devrait bien se passer. Donc l'idée c'est un truc genre genre tu enregistres ton pid dans une variable, tu copies ton script ailleurs (dans le /tmp) et tu le relances depuis la en tache de fond (enfin il se copie et se relance tout seul) : le père meurt, le fils (pid différent du pid enregistré, ou alors repertoire différent du père) occupe le /tmp, et tu dois pouvoir démonter ta partition. Jeremy -- Linux Registered User #317862 Linux From Scratch Registered User #16571 Please do not send me .doc, .xls, .ppt, as I will *NOT* read them.
On 2/23/06, Jeremy Monnet <jmonnet@gmail.com> wrote:
On 2/23/06, Philippe Jacquot <philippe.j@sparx.com> wrote:
Je répète donc l'idée: lancer un script hébergé sur un mount, et au sein de ce script (ou d'un fils), démounter le partage, faire 2, 3 trucs, puis le remonter.
Si j'ai compris le fond du problème : tu lances un script et tu veux ensuite démonter l'endroit ou est ce script, donc ca rale ? Une idée (pas testée) est-ce que ca change quelque chose si tu "forkes" ton script ? Le probleme est que le script "utilise" un repertoire, mais si le script se finit, ca devrait bien se passer.
Donc l'idée c'est un truc genre genre tu enregistres ton pid dans une variable, tu copies ton script ailleurs (dans le /tmp) et tu le relances depuis la en tache de fond (enfin il se copie et se relance tout seul) : le père meurt, le fils (pid différent du pid enregistré, ou alors repertoire différent du père) occupe le /tmp, et tu dois pouvoir démonter ta partition.
J'arrive a un résultat avec ca (et oui, c'est du bash a cause de ca ${0##*/} ) : #!/bin/bash if test -n $PID then sleep 2 echo "je suis le fils" > logfile lsof /root/test_fork_script/mnt/ >> logfile umount /root/test_fork_script/mnt/ if test $? -eq 0 then echo "est demonte ?" >> logfile else echo "erreur ?" >> logfile fi fi if test -z $PID then export PID=$$ cp $0 /tmp cd /tmp ./${0##*/} & fi exit Ca me marque un message d'erreur, mais c Jeremy -- Linux Registered User #317862 Linux From Scratch Registered User #16571 Please do not send me .doc, .xls, .ppt, as I will *NOT* read them.
On 2/23/06, Jeremy Monnet <jmonnet@gmail.com> wrote: Bon, une fois nettoyé, ca donne ca : #!/bin/bash if test -z $PID then export PID=$$ cp $0 /tmp cd /tmp ./${0##*/} & else sleep 2 umount /root/test_fork_script/mnt/ fi Jeremy -- Linux Registered User #317862 Linux From Scratch Registered User #16571 Please do not send me .doc, .xls, .ppt, as I will *NOT* read them.
Jeremy Monnet a écrit :
On 2/23/06, Jeremy Monnet <jmonnet@gmail.com> wrote: Bon, une fois nettoyé, ca donne ca :
#!/bin/bash if test -z $PID then export PID=$$ cp $0 /tmp cd /tmp ./${0##*/} & else sleep 2 umount /root/test_fork_script/mnt/ fi
Hmmm.. bizarre, j'avais essayé cette technique et ça ne marchait pas. Je vais essayer d'implémenter comme ça. De manière basique, ça semble le faire. Mais du coup, je vois pas pourquoi ça le faisait pas pour mon gros script. Peut-être un fork qui continuait d'occuper le share Marzi
Jeremy -- Linux Registered User #317862 Linux From Scratch Registered User #16571 Please do not send me .doc, .xls, .ppt, as I will *NOT* read them. _______________________________________________ Shell mailing list Shell@lists.asyd.net http://lists.asyd.net/mailman/listinfo.cgi/shell
Jeremy Monnet a écrit :
On 2/23/06, Jeremy Monnet <jmonnet@gmail.com> wrote: Bon, une fois nettoyé, ca donne ca :
#!/bin/bash if test -z $PID then export PID=$$ cp $0 /tmp cd /tmp ./${0##*/} & else sleep 2 umount /root/test_fork_script/mnt/ fi
De fait, je faisais un truc comme ça: #!/bin/bash if [ "x$0" == "xson" ]; then # ceci est le fils bidule truc machin umount /tra/la/la else # ceci est le popa zwig zwug exec -a son $0 fi Qui ne marche pas, donc.
From the man: If -a is supplied, the shell passes name as the zeroth argument to the executed command. Que j'ai traduit par "Si y'a -a, le shell pass "name" en $0".
Donc, en dehors de mon problème original, je sollicite vos connaissances sur cette option -a à l'exec de bash, et la façon de l'utiliser. Maarzi
Jeremy -- Linux Registered User #317862 Linux From Scratch Registered User #16571 Please do not send me .doc, .xls, .ppt, as I will *NOT* read them. _______________________________________________ Shell mailing list Shell@lists.asyd.net http://lists.asyd.net/mailman/listinfo.cgi/shell
On 2/24/06, Philippe Jacquot <philippe.j@sparx.com> wrote:
De fait, je faisais un truc comme ça:
#!/bin/bash if [ "x$0" == "xson" ]; then # ceci est le fils bidule truc machin umount /tra/la/la else # ceci est le popa zwig zwug exec -a son $0 fi
Qui ne marche pas, donc.
From the man: If -a is supplied, the shell passes name as the zeroth argument to the executed command. Que j'ai traduit par "Si y'a -a, le shell pass "name" en $0".
If command is specified, it replaces the shell. No new process is created. Ce qui veut dire que tu ne crées pas un nouveau fils, il remplace son père. Je ne suis pas sur d'obtenir le même comportement ? par exemple lancé en ligne de commande, la commande exec termine le shell. Logique, puisqu'il s'est remplacé par la commande donnée en argument, lorsque la commande s'arrête c'est la fin des haricots pour tout le monde. Jeremy -- Linux Registered User #317862 Linux From Scratch Registered User #16571 Please do not send me .doc, .xls, .ppt, as I will *NOT* read them.
Jeremy Monnet a écrit :
On 2/24/06, Philippe Jacquot <philippe.j@sparx.com> wrote:
De fait, je faisais un truc comme ça:
#!/bin/bash if [ "x$0" == "xson" ]; then # ceci est le fils bidule truc machin umount /tra/la/la else # ceci est le popa zwig zwug exec -a son $0 fi
Qui ne marche pas, donc.
From the man: If -a is supplied, the shell passes name as the zeroth argument to the executed command. Que j'ai traduit par "Si y'a -a, le shell pass "name" en $0".
If command is specified, it replaces the shell. No new process is created. Ce qui veut dire que tu ne crées pas un nouveau fils, il remplace son père. Je ne suis pas sur d'obtenir le même comportement ? par exemple lancé en ligne de commande, la commande exec termine le shell. Logique, puisqu'il s'est remplacé par la commande donnée en argument, lorsque la commande s'arrête c'est la fin des haricots pour tout le monde.
Oui, oui, de fait. Un exec, c'est juste le process qui charge un nouveau code, mais garde l'environnement, les descripteurs, etc... donc pas de fork. En l'occurence, "exec -a bidule machin", charge le code de "machin" et, si je comprend bien le man, devrait mettre "bidule" dans $0. Or $0 ne change pas après l'exec. So what's dat -a ? Par exemple, avec le code suivant (/tmp/truc): #!/bin/sh echo $0 $@ exec -a bidule $0 J'aurai pensé avoir une première ligne avec "/tmp/truc", puis les autres avec "bidule". Mais que nenni. D'où ma perplexité. :) thx qd mm et a +
Jeremy -- Linux Registered User #317862 Linux From Scratch Registered User #16571 Please do not send me .doc, .xls, .ppt, as I will *NOT* read them. _______________________________________________ Shell mailing list Shell@lists.asyd.net http://lists.asyd.net/mailman/listinfo.cgi/shell
On 2/24/06, Philippe Jacquot <philippe.j@sparx.com> wrote:
Oui, oui, de fait. Un exec, c'est juste le process qui charge un nouveau code, mais garde l'environnement, les descripteurs, etc... donc pas de fork. En l'occurence, "exec -a bidule machin", charge le code de "machin" et, si je comprend bien le man, devrait mettre "bidule" dans $0. Or $0 ne change pas après l'exec. So what's dat -a ?
Par exemple, avec le code suivant (/tmp/truc): #!/bin/sh echo $0 $@ exec -a bidule $0
J'aurai pensé avoir une première ligne avec "/tmp/truc", puis les autres avec "bidule". Mais que nenni. D'où ma perplexité. :)
thx qd mm et a +
Quelques essais en plus : dans 1 repertoire j'ai 1 script shell : #!/bin/bash echo "0 : $0" et un executable C : #include <stdio.h> int main(int argc, char ** argv) { printf("argv[0] : %s", argv[0]); return 0; } Jusqu'a ce soir je pensais que les 2 étaient équivalents, pourtant : gnu:~/test_fork_script# sh gnu:~/test_fork_script# exec -a bla ./script_exec.sh 0 : /root/test_fork_script/script_exec.sh gnu:~/test_fork_script# sh gnu:~/test_fork_script# exec -a bla ./essai_exec argv[0]: bla gnu:~/test_fork_script# sh gnu:~/test_fork_script# exec -ca bla ./script_exec.sh Segmentation fault l'option -c est censé passée un environnement vide ... drole le segfault ! Blague a part, toutes les options fonctionnent ... presque. le premier argument est bien mis a jour, mais pour une raison que j'ignore, ca n'est pas pris en compte dans les scripts shell. Jeremy -- Linux Registered User #317862 Linux From Scratch Registered User #16571 Please do not send me .doc, .xls, .ppt, as I will *NOT* read them.
On 2/23/06, Marc Chantreux <marc.chantreux@ulpmm.u-strasbg.fr> wrote:
J'arrive a un résultat avec ca (et oui, c'est du bash a cause de ca ${0##*/} )
ah ?
% dash $ e=/this/is/my $ echo ${e##*/} my
% mksh $ e=/this/is/my $ echo ${e##*/}
% zsh % e=/this/is/my % echo ${e##*/} my
Sur un HP-UX j'ai : sh-bourne(1) Bourne Shell (/usr/old/bin/sh) description. ksh(1) Korn Shell (/usr/bin/ksh) description. sh-posix(1) POSIX Shell (/usr/bin/sh) description. csh(1) C Shell (/usr/bin/csh) description. keysh(1) Key Shell (/usr/bin/keysh) description. bash-2.05$ /usr/old/bin/sh $ bla=/home/laet/truc/machin $ echo ${bla##*/} bad substitution $ Jeremy -- Linux Registered User #317862 Linux From Scratch Registered User #16571 Please do not send me .doc, .xls, .ppt, as I will *NOT* read them.
Jeremy Monnet a écrit :
On 2/23/06, Philippe Jacquot <philippe.j@sparx.com> wrote:
Je répète donc l'idée: lancer un script hébergé sur un mount, et au sein de ce script (ou d'un fils), démounter le partage, faire 2, 3 trucs, puis le remonter.
Si j'ai compris le fond du problème : tu lances un script et tu veux ensuite démonter l'endroit ou est ce script, donc ca rale ? Une idée (pas testée) est-ce que ca change quelque chose si tu "forkes" ton script ? Le probleme est que le script "utilise" un repertoire, mais si le script se finit, ca devrait bien se passer.
Donc l'idée c'est un truc genre genre tu enregistres ton pid dans une variable, tu copies ton script ailleurs (dans le /tmp) et tu le relances depuis la en tache de fond (enfin il se copie et se relance tout seul) : le père meurt, le fils (pid différent du pid enregistré, ou alors repertoire différent du père) occupe le /tmp, et tu dois pouvoir démonter ta partition.
Beh c'est bien dans ce sens-là que j'ai fait mes différents tests, oui.
Jeremy -- Linux Registered User #317862 Linux From Scratch Registered User #16571 Please do not send me .doc, .xls, .ppt, as I will *NOT* read them. _______________________________________________ Shell mailing list Shell@lists.asyd.net http://lists.asyd.net/mailman/listinfo.cgi/shell
Salut a tous. Philippe Jacquot a écrit : [zouip]
Je répète donc l'idée: lancer un script hébergé sur un mount, et au sein de ce script (ou d'un fils), démounter le partage, faire 2, 3 trucs, puis le remonter.
Mince ! Les vacances -- qui se sont bien passees, merci -- m'ont fait rater un truc interressant. J'ai pas vu la moindre reference a fuser dans les messages de ce fil, alors je pose la question : Que donne "fuser -m /mountpoint >/tmp/toto 2>&1" (ou "fuser -c /mountpoint ....") juste avant le umount ? Y'a pe un autre truc qui bloque ? Desole si j'ai dit une connerie, je crois pas etre totalement reveille ce matin. Christophe
participants (4)
-
Christophe Martin
-
Jeremy Monnet
-
Marc Chantreux
-
Philippe Jacquot