Suivre

J'apprend que xargs peut lancer des commandes en parallèle avec -P

Donc par exemple pour calculer la md5 des fichiers du répertoire courant avec 4 processus en parallèle:

find . -maxdepth 1 -type f -print0 | xargs -L1 -P4 -0 md5sum >> md5sums

@sebsauvage D'ailleurs au passage, md5 est plus lent que les autres hashs.

@lanodan @sebsauvage non, c'est juste qu'il existe des implémentations matérielles de certains algo (i.e. sha256).

@striker @Fritange

parallel n'est pas forcément dispo partout.

xargs est plus courant.

@sebsauvage @striker @Fritange ça pose pas des soucis de mélange des lignes genre sur des printfs sans le \n ?

@sebsauvage @striker @Fritange

dans le man :
« Veuillez noter qu'il revient aux processus appelés de gérer correctement les accès parallèles aux ressources partagées. Par exemple, si plus d'un processus essaye d'afficher sur la sortie standard, les sorties seront produites dans un ordre indéterminé (et vraisemblablement mélangées) »

@mmu_man @sebsauvage @striker @Fritange Ah oui xargs -P, faut surtout pas s’en servir si tu espères utiliser stdout/err à la fin. Tu peux avoir un bloubiboulga en sortie avec de l’interleave des sorties.

@aeris un mélange entre lignes est possible d’après mes souvenirs.

Dans l’exemple de calcul de MD5 ça ne pose pas de soucis, l’ordre des lignes n’importent pas pour passer le fichier à « md5sum -c »

(cc @mmu_man @sebsauvage @striker @Fritange)

@DaD @mmu_man @sebsauvage @striker @Fritange Il n’y a pas que l’ordre des lignes qui compte. Si un flush arrive sur une sortie, elle peut interleave en plein milieu de la ligne d’un autre.

@mmu_man @sebsauvage @striker @Fritange Si, totalement. J’ai personnellement dû changer mes logs pour ça, ça faisait de la merde (j’ai pas synchro l’output pour le coup, juste mis des \n partout ^^’)

@breizh @sebsauvage @Fritange @striker

idéalement il faudrait une option à xargs pour merger les stdout proprement en attendant les \n avant de balancer.

@mmu_man @sebsauvage @Fritange @striker Bof. C’est pas vraiment à xargs de faire ça je pense. Ça n’a aucun sens et c’est pas généralisable. En plus en général si tu mets pas de \n c’est pour afficher les différentes parties avec un délai (c’est mon cas par exemple), donc faire ça ruine tout l’intérêt.

@breizh @sebsauvage @Fritange @striker

Si, typiquement certains codes font des

printf("début de ligne %s blah",…);
// encore des calculs…
printf("suite de la ligne %s\n", …);

@mmu_man @sebsauvage @Fritange @striker C’est précisément ce que je dis. Dans ce cas tu veux pas afficher le tout en une seule fois à la fin. Sinon tu l’aurais affiché en une seule fois à la fin…

@sebsauvage @Fritange xargs viens avec viens par défaut sur (je dirais toutes) les distros/BSD

@sebsauvage @striker xargs est dispo partout mais gnu parallel est très puissant. Tu peux faire des choses différentes (xargs est très bien et permet de paralléliser après coup (puisque |xargs...), mais le man de gnu parallel est juste énorme).

@sebsauvage Par contre ça peut mélanger un peu la sortie. Mais très pratique, je m’en sert pour la génération de files.breizh.pm

C’est le plus simple quand n’a pas besoin d’être synchro.

@sebsauvage very pratique en effet. C'est rare d'en avoir besoin mais quand t'en a besoin, t'es content

Inscrivez-vous pour prendre part à la conversation
Framapiaf

Le réseau social de l'avenir : Pas d'annonces, pas de surveillance institutionnelle, conception éthique et décentralisation ! Possédez vos données avec Mastodon !