Xargs multithreads avec des exemples

Xargs multithreads avec des exemples

Si vous êtes nouveau dans xargs, ou ne sache pas quoi xargs est encore, veuillez lire nos xargs pour les débutants avec des exemples d'abord. Si vous êtes déjà quelque peu habitué xargs, et peut écrire de base xargs Instructions de ligne de commande sans regarder le manuel, alors cet article vous aidera à devenir plus avancé avec xargs sur la ligne de commande, surtout en le faisant multiplier.

Dans ce tutoriel, vous apprendrez:

  • Comment utiliser xargs -P (mode multi-thread) à partir de la ligne de commande en bash
  • Exemples d'utilisation avancées utilisant xargs de la ligne de commande à bash
  • Une compréhension plus profonde de la façon de l'appliquer xargs multithread à votre code de bash existant
Xargs multithreads avec des exemples

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant de la distribution Linux
Logiciel Ligne de commande bash, système basé sur Linux
Autre Le xargs L'utilité est incluse dans la coquille de bash par défaut
Conventions # - nécessite que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - exige que les commandes Linux soient exécutées en tant qu'utilisateur régulier non privilégié

Exemple 1: appeler une autre coquille de bash avec entrée compilée xargs



Après une utilisation pour apprendre xargs, Il ou elle trouvera bientôt cela - alors que xargs permet de faire beaucoup de choses puissantes en soi - le pouvoir de xargs semble être limité par son incapacité à exécuter plusieurs commandes en séquence.

Par exemple, disons que nous avons un répertoire qui a nommé des sous-répertoires nommés 00 pour dix (11 au total). Et, pour chacun de ces sous-répertoires, nous voulons y aller et vérifier si un fichier nommé déposer.SMS existe, et si c'est le cas chat (et fusionner en utilisant >>) le contenu de ce fichier dans un fichier Total_file.SMS dans le répertoire où le 00 pour dix Les répertoires sont. Essayons de faire ça avec xargs en différentes étapes:

$ mkdir 00 01 02 03 04 05 06 07 08 09 10 $ ls 00 01 02 03 04 05 06 07 08 09 10 $ echo 'a'> 03 / fichier.txt $ echo 'b'> 07 / fichier.txt $ echo 'c'> 10 / fichier.SMS 

Ici, nous créons d'abord 11 répertoires, 00 pour dix et ensuite créer 3 échantillons déposer.SMS Fichiers dans les sous-répertoires 03, 07 et dix.

$ trouver . -MAXDEPTH 2-TYPE F -NAME Fichier.SMS ./ 10 / fichier.SMS ./ 07 / fichier.SMS ./ 03 / fichier.SMS 

Nous écrivons ensuite un trouver commande pour localiser tout déposer.SMS Fichiers commençant par le répertoire actuel (.) et cela jusqu'à un maximum de 1 niveau de sous-répertoires:

$ trouver . -MAXDEPTH 2-TYPE F -NAME Fichier.txt | xargs -i  cat > ./ total_file.txt $ cat total_file.txt c b a 

Le -Maxdepth 2 indique le répertoire actuel (1) et Toutes les sous-répertoires de ce répertoire (d'où le profondeur max de 2).

Enfin nous utilisons xargs (avec le recommandé et préféré chaîne de remplacement comme transmis aux xargs -je remplacer la corde option) Pour catch le contenu de tout tel fichier situé par le trouver Commande dans un fichier dans le répertoire actuel nommé Total_file.SMS.

Quelque chose de bien à noter ici est que, même si l'on penserait xargs comme exécutant par la suite plusieurs chat commandes toutes les redirections vers le même fichier, on peut utiliser > (Sortie sur un nouveau fichier, créant le fichier s'il n'existe pas encore et écraser n'importe quel fichier avec le même nom déjà là) au lieu de >> (Ajoutez à un fichier et créez le fichier s'il n'est pas encore existant)!



L'exercice jusqu'à présent sorte de rempli nos exigences, mais il ne correspondait pas exactement à l'exigence - à savoir, elle ne traverse pas les sous-répertoires. Il n'a pas non plus utilisé le >> Redirection comme spécifié, bien que l'utilisation dans ce cas aurait toujours fonctionné.

Le défi avec l'exécution de plusieurs commandes (comme le spécifique CD Commande requise pour changer le répertoire / traversée dans le sous-répertoire) de l'intérieur xargs est-ce que 1) ils sont très difficiles à coder, et 2) il peut ne pas être possible de coder cela du tout.

Il existe cependant un moyen différent et facile à comprendre de coder ceci, et une fois que vous savez comment le faire, vous l'utiliserez probablement en abondance. Plongeons-nous dans.

$ rm total_file.SMS 

Nous avons d'abord nettoyé notre sortie précédente.

$ ls -d --color = jamais [0-9] [0-9] | xargs -i  echo 'cd ; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi 'CD 00; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi CD 01; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi CD 02; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi CD 03; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi CD 04; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi CD 05; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi CD 06; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi CD 07; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi CD 08; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi CD 09; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi CD 10; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; Fi 

Ensuite, nous avons formulé une commande, cette fois en utilisant LS qui répertoriera tous les répertoires qui correspondent au [0-9] [0-9] Expression régulière (Lisez notre article avancé Bash Regex avec des exemples pour plus d'informations sur les expressions régulières).

Nous avons également utilisé xargs, mais cette fois (en comparaison avec les exemples précédents) avec un écho Commande qui sortira exactement ce que nous aimerions faire, même si cela nécessite plus d'une ou plusieurs commandes. Pensez-y comme un mini-script.

Nous utilisons également CD se transformer en répertoires indiqués par le ls -d (répertoires uniquement) Commande (qui, en tant que note latérale, est protégée par le --color = jamais clause empêchant tous les codes de couleur dans le LS Sortie de l'inclinaison de nos résultats) et vérifiez si le fichier déposer.SMS y a-t-il dans le sous-répertoire en utilisant un Si [-r… commande. S'il existe, nous chat le déposer.SMS dans … / Total_file.SMS. Noter la comme le CD dans la commande nous a placés dans le sous-répertoire!

Nous exécutons cela pour voir comment cela fonctionne (après tout, seul le écho est exécuté; Rien ne se passera réellement). Le code généré a l'air super. Avançons un peu plus loin maintenant et exécutons réellement la même chose:

$ ls -d --color = jamais [0-9] [0-9] | xargs -i  echo 'cd ; Si [-r ./déposer.SMS ]; puis fichier de chat.txt >>… / total_file.SMS; fi '| xargs -i  bash -c "" $ cat total_file.txt a b c 


Nous avons maintenant exécuté le script total en utilisant un spécifique (et toujours le même, je.e. Vous vous retrouverez à écrire | xargs -i bash -c "" avec une certaine régularité) commande, qui exécute tout ce qui a été généré par le écho le précédant: xargs -i bash -c "". En gros. Très puissant!

Exemple 2: xargs multithread

Ici, nous allons jeter un œil à deux xargs commandes, l'une exécutée sans exécution parallèle (multi-thread), l'autre avec. Considérez la différence entre les deux exemples suivants:

$ temps pour i en $ (seq 1 5); faire écho $ [$ aléatoire% 5 + 1]; fait | xargs -i  echo "sleep ; echo 'fait!  '"| xargs -i  bash -c"  "fait! 5 fait! 5 fait! 2 fait! 4 fait! 1 réel 0m17.User 016s 0m0.017S SYS 0M0.003 
$ temps pour i en $ (seq 1 5); faire écho $ [$ aléatoire% 5 + 1]; fait | xargs -i  echo "sleep ; echo 'fait!  '"| xargs -p5 -i  bash -c"  "fait! 1 fait! 3 fait! 3 fait! 3 fait! 5 réel 0m5.Utilisateur 019S 0m0.036S sys 0m0.015 

La différence entre les deux lignes de commande réelles est petite; Nous avons seulement ajouté -P5 Dans la deuxième ligne de commande. Le temps d'exécution cependant (mesuré par le temps Préfixe de commande) est significatif. Découvrons pourquoi (et pourquoi la sortie diffère!).



Dans le premier exemple, nous créons un pour boucle qui fonctionnera 5 fois (en raison de la sous-coquille $ (SEQ 1 5) générer des nombres à partir de 1 pour 5) et nous y faisons écho un nombre aléatoire entre 1 et 5. Ensuite, beaucoup en ligne avec le dernier exemple, nous avons envoyé cette sortie dans la commande de sommeil, et avons également sorti la durée dormi dans le cadre du fait! écho. Enfin, nous avons envoyé cela pour être exécuté par une commande de bash bash, encore une fois de la même manière à notre dernier exemple.

La sortie de la première commande fonctionne comme ceci; exécuter un sommeil, un résultat de sortie, exécuter le prochain sommeil, etc.

La deuxième commande change cependant complètement ce. Ici, nous avons ajouté -P5 qui commence essentiellement 5 fils parallèles en même temps!

La façon dont cette commande fonctionne est: Démarrez sur x threads (tel que défini par l'option -p) et traitez-les simultanément. Lorsqu'un thread est terminé, prenez immédiatement une nouvelle entrée, n'attendez pas que d'autres threads se terminent en premier. La dernière partie de cette description n'est pas applicable ici (ce serait seulement s'il y avait moins de threads spécifiés par -P Ensuite, le nombre de «lignes» d'entrée indiquées, ou en d'autres termes moins parallèles serait disponible alors le nombre de lignes d'entrée).

Le résultat est que les fils qui terminent en premier - ceux qui ont un court temps de sommeil aléatoire - remontent d'abord et sortent leur «fait!' déclaration. Le temps d'exécution total passe également d'environ 17 secondes à environ 5 secondes exactement en temps réel. Cool!

Conclusion

En utilisant xargs est l'un des moyens les plus avancés, et aussi les plus puissants, de coder en bash. Mais ça ne s'arrête pas à utiliser xargs! Dans cet article, nous avons ainsi exploré une exécution parallèle multithreade via le -P option de xargs. Nous avons également envisagé d'appeler des sous-coquilles en utilisant $ () et enfin nous avons introduit une méthode pour passer directement les instructions multi-commands xargs en utilisant un bash -c appel de sous-coquille.

Puissant? Nous pensons que oui! Laissez-nous vos pensées.

Tutoriels Linux connexes:

  • Exemples sur la façon d'utiliser la commande xargs sur Linux
  • Gestion de scripts et de processus de bash multithread au…
  • xargs pour les débutants avec des exemples
  • Masterring Bash Script Loops
  • Comment utiliser des sous-coquilles bash à l'intérieur des instructions IF
  • Commandes Linux de base
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Commandes Linux: les 20 meilleures commandes les plus importantes que vous devez…
  • Système linux hung? Comment s'échapper vers la ligne de commande et…
  • Choses à installer sur Ubuntu 20.04