OVH Cloud OVH Cloud

shell script et processus asynchrones

5 réponses
Avatar
manu
Immaginons que je veuille à intervalle de temps regulier afficher où en
est un dd long, je peux faire ca:

dd if=foo of=bar bs=1024 count=$total &
pid=$!
while kill -INFO $pid 2>/dev/null ; do sleep 10 ; done

Bon, maintenant, si je veux faire la même chose, mais en filtrant
l'erreur standard de dd pour par exemple afficher le pourcentage, un
truc du genre:

dd if=foo of=bar bs=1024k count=$total | \
awk -vt=$total '!(NR % 3}{printf("%02d%%\n", $1*100/(1024*t));}'

Le but du jeu est de combiner ca avec le bout de shell script décrit
plus haut, mais le pid=$! va me donner le pid de awk et plus celui de
dd.

Une astuce pour résoudre ce problème?

--
Emmanuel Dreyfus
manu@netbsd.org

5 réponses

Avatar
lhabert
Le plus simple consiste à passer par un pipe nommé.
Avatar
Stephane Chazelas
2006-05-17, 22:22(+02), Emmanuel Dreyfus:
Immaginons que je veuille à intervalle de temps regulier afficher où en
est un dd long, je peux faire ca:

dd if=foo ofºr bs24 count=$total &
pid=$!
while kill -INFO $pid 2>/dev/null ; do sleep 10 ; done

Bon, maintenant, si je veux faire la même chose, mais en filtrant
l'erreur standard de dd pour par exemple afficher le pourcentage, un
truc du genre:

dd if=foo ofºr bs24k count=$total |
awk -vt=$total '!(NR % 3}{printf("%02d%%n", $1*100/(1024*t));}'

Le but du jeu est de combiner ca avec le bout de shell script décrit
plus haut, mais le pid=$! va me donner le pid de awk et plus celui de
dd.

Une astuce pour résoudre ce problème?
[...]


Avec zsh, la liste des pid se trouve dans $jobstates[<jobnr>]

Sinon du peux faire:

{
dd if=foo ofºr bs24 count="$total" &
pid=$!
while kill -INFO "$pid" 2>/dev/null ; do sleep 10 ; done
} | awk ...

C'est quoi "kill -INFO", BTW?



--
Stéphane

Avatar
manu
Stephane Chazelas wrote:

C'est quoi "kill -INFO", BTW?


Ca dit à dd de dire où il en est.

--
Emmanuel Dreyfus


Avatar
Stephane Chazelas
2006-05-18, 22:37(+02), Emmanuel Dreyfus:
Stephane Chazelas wrote:

C'est quoi "kill -INFO", BTW?


Ca dit à dd de dire où il en est.
[...]


Ma question etait plutot d'ou vient ce SIGINFO. Ce n'est pas un
signal POSIX ou Unix. Apparemment, c'est du BSD. Ce signal peut
etre generé par un driver de terminal sur reception du control-character
"status" (par defaut <Ctrl-T>).

C'est pas con.

http://www.freebsd.org/cgi/man.cgi?query=termios&sektion=4&manpath=FreeBSD+6.0-RELEASE

| STATUS Special character on input and is recognized if the ICANON flag
| is set. Receipt of this character causes a SIGINFO signal to be
| sent to the foreground process group of the terminal. Also, if
| the NOKERNINFO flag is not set, it causes the kernel to write a
| status message to the terminal that displays the current load
| average, the name of the command in the foreground, its process
| ID, the symbolic wait channel, the number of user and system sec-
| onds used, the percentage of cpu the process is getting, and the
| resident set size of the process.

Ca n'a meme pas l'air d'etre recent, ca a l'air d'avoir deja ete
la dans FreeBSD 1.0 et ses ancetres. Premiere fois que j'en
/entends/ parler.

--
Stéphane


Avatar
Christophe Blaess
Ma question etait plutot d'ou vient ce SIGINFO. Ce n'est pas un
signal POSIX ou Unix. Apparemment, c'est du BSD. Ce signal peut
etre generé par un driver de terminal sur reception du control-character
"status" (par defaut <Ctrl-T>).

C'est pas con.


Tiens c'est marrant, je ne connaissais pas ce site :

<http://www.siginfo.org/>


--
Christophe