[gull] Truc et astuces: multithread en bash

felix felix at f-hauri.ch
Mon Dec 28 21:44:28 CET 2020


Re,

On Mon, Dec 28, 2020 at 08:20:20PM +0100, Daniel Cordey wrote:
> On 28/12/2020 17:01, felix wrote:

> Jolie démo !
Merci ;)

> Toutefois, et sans vouloir me montrer trop maniaque, il s'agit là plutôt de
> multi-processing et non de vrai multi-threading.
Je m'attendais à cette remarque!

> Le multi-threading conserve l'accès ...
> 
> Pour résumer, le shell initial lit le stdin et attend une commande, pendant
> que le 'ping' est exécuté dans un autre process et va recevoir un signal lui
> disant de se terminer.
Hem oui, mais non: le shell initial lit le stdin de l'utilisateur! Les pings
utilisent d'autres descripteurs!

> Aussi, 'ping' n'étant pas une commande interne du shell... sous-process...
> ... il faudrait une version vraiment spéciale de bash pour...
Je suis d'accord, cependant

Du point de vue du script lui même, il converse *effectivement* avec au moins
deux thread indépendant: Les pings et l'utilisateur

   $ cat -n multiping.sh | grep read\ -
    18      read -u ${fds[$1]} -r line
    55      if read -rsn 1 -t .2 key ;then
    62          read -t 0 -u ${fds[i]} && pingInput $i

A la ligne 62, avec ``read -t 0 -u $fd'', je test si des données sont à lire
sur $fd. (Avec `select' je n'aurrai besoin que d'une commande pour plusieurs
FD, alors que là, je dois faire :
    61      for i in ${!fds[@]};do
pour tester chaque descripteur après un petit délai (0,2 sec) à la ligne 55.
La ligne 55 réagit à la pression d'une touche (n'attend par de fin de ligne)
et stoque la touche lue dans $key, que je teste avec un ``case'' afin de
pouvoir ajouter des ``features'' à mon script...

J'utilise un seul signal pour l'IPC (oui, c'est du multitâche, j'avoue** ;),
c'est INT naturellement géré par ping, permettant à ping de générer les
lignes de statistiques:
   --- f-hauri.ch ping statistics ---
   2 packets transmitted, 2 received, 0% packet loss, time 2ms
   rtt min/avg/max/mdev = 9.457/9.740/10.023/0.283 ms
Que je récupére égallement au niveau du script (indépendament de leur
ordre d'arrivée) pour présenter sur une ligne avant de quitter

**Note que ceci est précisement la force du bash:
    Il est fait pour conjuguer avec d'autre trucs!
On peut *très* facilement remplacer ``ping'' par ``ssh'', ``ftp'', ``mysql'',
sans parler de `date -f - +%s` ou `bc -l`que j'utilise parfois,
ou encore ``gs'' (J'ai fait une sorte de open3 avec ghostscript:
    exec {pnm}<> <(:)
    coproc gs -q -sDEVICE=pnmraw -dSAFER -r$(( ores * scale )) -dBATCH \
           -sOutputFile=/dev/fd/$pnm "$1" -c quit
  pour rasteriser en 800dpi et sauver en 200dpi, en faisant page par page...
  afin de ne pas nécessiter trop d'espace disque pour des pdf de centaines
  de pages: j'attend sur le stdout (de gs) ``showpage, press <return>...'',
  puis je lis chaque page avec ``pnmnoraw </dev/fd/${pnm}|tee pnm|cjpeg...''
  puis ``return'' dans le stdin de gs pour la page suivante... Là, pendant
  que ghostscript convertis la page suivante, je convertis la réduction -
  précédement sauvée en jpg et en pnm - en png en réduisant les couleurs
  en fonction de nombre de couleurs de l'original. J'efface le pnm et le
  plus gros de deux jpg et png. Avant de boucler... Du vrai multitâche;)

... et quand je dis "remplacer", je pourrais dire "ajouter": il est facile
d'envisager un script avec du sql (avec trigger, ou `inotifiwait -m`), ET
ssh ou sftp, pour publier des modification automatiquement, par exemple...

Sans compter que tu peux interfacer ton propre code assembleur, C
ou python;)

--
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch


More information about the gull mailing list