Comment étrangler une commande dans une fenêtre de terminal?

8

J'avais besoin de courir convertavec beaucoup d'images en même temps. La commande a pris un certain temps mais cela ne me dérange pas.

Le problème est que cette commande a rendu mon ordinateur inutilisable pendant son exécution (pendant environ 15 minutes).

Est-il donc possible de limiter la commande en limitant les ressources (processeur et mémoire) à la commande, directement depuis la ligne de commande? Cela ne peut fonctionner que si j'ajoute quelque chose à la même ligne avant d'appuyer sur, Entercar une fois que je démarre le processus, l'ordinateur ralentit tellement qu'il est impossible par exemple de basculer vers "Moniteur système" et de réduire la priorité.

Modifier: résultats top et iotop

J'ai réussi à exécuter topet à sudo iotop >iotop.txteffectuer l'une de ces opérations de conversion. (Le fichier iotop.txt produit est difficile à lire)

Résultats de haut:

   UTILISATEUR PID PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND           
14275 nom d'utilisateur 20 0 4043m 3.0g 1448 D 7.0 80.4 0: 16.45 convert 

Résultats de iotop:

[? 1049h [1; 24r (B [m [4l [? 7h [? 1h = [39; 49m [? 25l [39; 49m (B [m [H [2JTOTAL DISK READ: 1269.04 K / s | Total DISK WRITE)) : [59G0.00 B / s
(B [0; 7m TID PRIO USER DISK READ DISK WRITE SWAPIN (B [0; 1; 7m IO> (B [0; 7m COMMAND [3; 2H (B [m2516 be / 4 username 350.08 K / s 0.00 B / s 0,00% 0,00% zeitgeist-datahub
 7394 be / 4 nom d'utilisateur 568,88 K / s 0,00 B / s 77,41% 0,00% --rendere ~ .530483991 [5; 1H14275 nom d'utilisateur inactif 350,08 K / s 0,00 B / s 37,49% 0,00% convertir S ~ f test.pdf [6 ; 2H2048 être / 4 racine [6; 24H0,00 B / s 0,00 B / s 0,00% 0,00% [kworker / 3: 2]
[5G1 be / 4 racine [7; 24H0,00 B / s 0,00 B / s 0,00% 0,00% init

En outre, même après la fin du processus, l'ordinateur ne revient pas aux performances précédentes. J'ai trouvé un moyen de contourner cela en courant sudo swapoff -asuivi desudo swapon -a

Faire
la source

Réponses:

5

Oh, mon garçon, je viens de prendre ça ... citant OP:

En outre, même après la fin du processus, l'ordinateur ne revient pas aux performances précédentes. J'ai trouvé un moyen de contourner cela en courant sudo swapoff -asuivi desudo swapon -a

OK, cela signifie que vous épuisiez la mémoire RAM disponible sur votre système, ce qui signifie que vous essayez simplement d'exécuter trop de convertprocessus à la fois. Nous aurions besoin de regarder votre syntaxe réelle lors de la génération convertpour vous conseiller, mais fondamentalement, vous devez vous assurer que vous n'essayez pas d'ouvrir plus de processus simultanés que vous n'avez de RAM à gérer confortablement.

Puisque vous dites ce qui est à l'origine de cela convert *.tif blah.pdf, ce qui se passe, c'est que le contenu de chaque TIF et sa conversion au format PDF sont remplis en même temps dans la RAM. Ce que vous devez faire est de diviser le travail afin que cela ne soit pas nécessaire. Une possibilité qui me vient à l'esprit est plutôt de faire quelque chose comme find . -iname '*.tif' | xargs -I% convert % %.pdf, puis de l'utiliser pdftkou quelque chose comme ça pour coller tous les fichiers PDF individuels ensemble. Si vous voulez vraiment devenir sophistiqué et que vous avez un processeur multicœur, cela vous donne également la possibilité d'écrire un petit script pour exécuter des conversions en lots de n , où n est votre nombre de cœurs, et faire le tout beaucoup plus rapidement . :)

Comment faire pdftk: http://ubuntuhowtos.com/howtos/merge_pdf_files (se résume essentiellement à sudo apt-get install pdftk; pdftk *.pdf cat output merged.pdf)

Jim Salter
la source
J'exécute juste UN convert *.tif bla.pdfprocessus à la fois, mais l'entrée est un tas d'images tif. C'est un moyen de produire un pdf à partir d'un tas d'images qui fonctionne bien mais étouffe mon PC.
À faire
^^ voir la réponse modifiée s'il vous plaît :)
Jim Salter
Cela a parfaitement fonctionné avec une simple modification. find . -iname '*.tif' | xargs -I% convert % %.pdfau lieu de find . -iname '*.pdf' | xargs -I% convert % %.pdf. C'était plus rapide aussi! Merci.
À faire
Désolé, dysfonctionnement entre le cerveau et les doigts :-)
Jim Salter
Une petite modification… C'est une bonne chose de connaître les options -execet les . Dans votre cas, au lieu d'utiliser , j'utiliserais:-execdirfindxargsfind -iname '*.tif' -execdir convert {} {}.pdf ';'
Paddy Landau
12

man niceEt si vous avez besoin d' étranglement d' E / S man ionice.

Regardons quelques exemples simples.

Limitation de l'utilisation du processeur:

you@box:/$ nice -n 10 /usr/bin/convert blah.gif blah.jpg

D'après votre description, cependant, l'utilisation du processeur n'est certainement pas votre vrai problème ici. Plus probablement, vous rencontrez de graves conflits d'E / S.

Utilisation du disque de limitation:

you@box:/$ ionice -c2 -n7 /usr/bin/convert blah.gif blah.jpg

-c2est le "meilleur effort", et -n7est la priorité la plus basse "au meilleur effort". Ainsi, cela réduira le travail pour réduire la priorité d'E / S par rapport à la plupart des autres éléments du système.

you@box:/$ ionice -c3 /usr/bin/convert blah.gif blah.jpg

-c3(aucun niveau de priorité nécessaire) signifie "Inactif uniquement". Les travaux définis sur -c3UNIQUEMENT prennent du temps de planification de disque autrement inactif, pour pratiquement aucun impact sur le système - mais potentiellement un temps d'exécution considérablement plus long pour votre travail, en fonction de l'occupation du reste du système.

Jim Salter
la source
Comment intégrer nicedans une commande de conversion? Si je ne me trompe pas, cela fonctionne bien pour les processus déjà en cours d'exécution.
À faire
1
Voir ci-dessus ... Aussi, srsly, lisez la page de manuel. C'est une page de manuel très facile, pas du tout moelleuse. :-)
Jim Salter
Je l'ai essayé. En quelque sorte aidé mais pas assez. J'essaierai la nice -n 20prochaine fois.
À faire
Honnêtement, je ne suis pas trop sûr que la charge CPU soit votre problème ici. Avez-vous essayé de le faire iotoplors de l'exécution du processus? Habituellement, un seul processus consommant beaucoup de CPU aura très peu d'effet sur l'utilisabilité du système, mais un processus qui écrase le disque dur peut TRÈS rapidement tout arrêter brutalement - surtout si vous utilisez un lecteur conventionnel, pas un SSD.
Jim Salter
Étant donné que l'ensemble du système devient assez inutilisable pour vous, vous pouvez essayer quelque chose dans le sens de convert blah.gif blah.jpg & iotopce qui iotopse déclenchera instantanément dès que vous aurez commencé votre converttravail.
Jim Salter
2

Voici un assez bon article sur l'utilisation d'un programme appelé cpulimitpour limiter l'utilisation du processeur de tout processus:

http://maketecheasier.com/limit-cpu-usage-of-any-process-in-linux/2010/09/22

Le problème est comme vous l'avez dit trouver le PID du convertprocessus après son démarrage.

Après avoir démarré convertsi vous pouvez toujours taper des commandes dans le terminal, vous pouvez exécuter ps aux | grep convertpour trouver son PID, puis sudo cpulimit -p PID -l CPU%pour commencer la limitation.

Ou si le démarrage convertverrouille également votre terminal, l'article vous montre comment vous pouvez exécuter en cpulimittant que démon d'arrière-plan qui surveillera et limitera automatiquement tous les processus sur une certaine quantité d'utilisation du processeur. Bonne chance!

lisse-texan
la source
Ce script est une mauvaise idée et primitif par rapport à la nicecommande intégrée . cpulimitlimitera le processus à un certain% d'utilisation du processeur, que quoi que ce soit d'autre ait besoin du temps du processeur; nice, en revanche, définit des niveaux de priorité (40 au total!) qui permettent de hiérarchiser une tâche au-dessus (ou en dessous) des autres.
Jim Salter