Wie drossle ich einen Befehl in einem Terminalfenster?

8

Ich musste convertmit vielen Bildern gleichzeitig laufen . Der Befehl hat eine Weile gedauert, aber das stört mich nicht.

Das Problem ist, dass dieser Befehl meinen Computer unbrauchbar machte, während der Befehl ausgeführt wurde (für ungefähr 15 Minuten).

Ist es also möglich, den Befehl zu drosseln, indem Ressourcen (Prozessor und Speicher) direkt über die Befehlszeile auf den Befehl beschränkt werden? Dies kann nur funktionieren, wenn ich vor dem Drücken etwas zur selben Zeile hinzufüge, Enterda der Computer nach dem Start des Vorgangs so langsam wird, dass es beispielsweise unmöglich ist, auf "Systemmonitor" umzuschalten und die Priorität zu verringern.

Bearbeiten: Top- und Iotop-Ergebnisse

Ich konnte laufen topund sudo iotop >iotop.txtwährend einer dieser convert Operationen zu tun. (Die erzeugte Datei iotop.txt ist schwer zu lesen.)

Ergebnisse von oben:

   PID BENUTZER PR NI VIRT RES SHR S% CPU% MEM ZEIT + BEFEHL           
14275 Benutzername 20 0 4043m 3,0 g 1448 D 7,0 80,4 0: 16,45 konvertieren 

Ergebnisse von 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; 7 m TID PRIO USER DISK READ DISK WRITE SWAPIN (B [0; 1; 7 m IO>) (B [0; 7 m BEFEHL [3; 2H (B [m2516 be / 4 Benutzername 350,08 K / s 0,00 B / s 0,00% 0,00% Zeitgeist-Datahub
 7394 be / 4 Benutzername 568,88 K / s 0,00 B / s 77,41% 0,00% --rendere ~ .530483991 [5; 1H14275 Leerlaufbenutzername 350,08 K / s 0,00 B / s 37,49% 0,00% konvertieren S ~ f test.pdf [6 ; 2H2048 be / 4 root [6; 24H0,00 B / s 0,00 B / s 0,00% 0,00% [kworker / 3: 2]
[5G1 be / 4 root [7; 24H0,00 B / s 0,00 B / s 0,00% 0,00% init

Darüber hinaus kehrt der Computer auch nach Beendigung des Vorgangs nicht zur vorherigen Leistung zurück. Ich fand einen Weg, dies zu umgehen, sudo swapoff -aindem ich rannte, gefolgt vonsudo swapon -a

Machen
quelle

Antworten:

5

Oh, Junge, ich habe das gerade erwischt ... unter Berufung auf OP:

Darüber hinaus kehrt der Computer auch nach Beendigung des Vorgangs nicht zur vorherigen Leistung zurück. Ich fand einen Weg, dies zu umgehen, sudo swapoff -aindem ich rannte, gefolgt vonsudo swapon -a

OK, das bedeutet, dass Sie den verfügbaren Arbeitsspeicher Ihres Systems erschöpft haben, was bedeutet, dass Sie einfach versuchen, zu viele convertProzesse gleichzeitig auszuführen . Wir müssten uns Ihre tatsächliche Syntax beim Laichen ansehen, convertum Ratschläge zu erhalten, aber im Grunde müssen Sie sicherstellen, dass Sie nicht versuchen, mehr simultane Prozesse zu öffnen, als Sie über den RAM verfügen, um bequem damit umzugehen.

Da Sie angeben, was dies verursacht convert *.tif blah.pdf, geschieht der Inhalt jedes einzelnen TIF und seine Konvertierung in PDF sofort in den Arbeitsspeicher. Sie müssen den Job aufteilen, damit dies nicht erforderlich ist. Eine Möglichkeit, die mir in den Sinn kommt, besteht darin, stattdessen so etwas zu tun find . -iname '*.tif' | xargs -I% convert % %.pdfund dann pdftkoder so etwas zu verwenden, um alle einzelnen PDFs zusammenzukleben. Wenn Sie wirklich Lust haben möchten und über eine Multicore-CPU verfügen, können Sie auch ein kleines Skript schreiben, um Konvertierungen in Stapeln von n auszuführen , wobei n Ihre Anzahl von Kernen ist, und das Ganze erheblich schneller erledigen . :) :)

pdftk How-to: http://ubuntuhowtos.com/howtos/merge_pdf_files ( läuft im Grunde auf sudo apt-get install pdftk; pdftk *.pdf cat output merged.pdf)

Jim Salter
quelle
Ich convert *.tif bla.pdfführe jeweils nur EINEN Prozess aus, aber die Eingabe besteht aus einer ganzen Reihe von TIF-Bildern. Es ist eine Möglichkeit, ein PDF aus einer Reihe von Bildern zu erstellen, die gut funktionieren, aber meinen PC ersticken.
Zu tun
^^ siehe bearbeitete Antwort bitte :)
Jim Salter
Dies funktionierte perfekt mit einer einfachen Modifikation. find . -iname '*.tif' | xargs -I% convert % %.pdfstatt find . -iname '*.pdf' | xargs -I% convert % %.pdf. Es war auch schneller! Vielen Dank.
Zu tun
Entschuldigung, Fehlfunktion zwischen Gehirn und Fingern :-)
Jim Salter
Eine kleine Modifikation… Es ist eine gute Sache, über die -execund -execdirOptionen für zu wissen find. In Ihrem Fall xargswürde ich anstelle von verwenden:find -iname '*.tif' -execdir convert {} {}.pdf ';'
Paddy Landau
12

man niceund wenn Sie eine E / A-Drosselung benötigen man ionice.

Schauen wir uns einige einfache Beispiele an.

Drosselung der CPU-Auslastung:

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

Nach Ihrer Beschreibung ist die CPU-Auslastung hier jedoch mit ziemlicher Sicherheit nicht Ihr eigentliches Problem. Wahrscheinlicher ist, dass Sie ernsthafte E / A-Konflikte haben.

Verwendung der Drosselscheibe:

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

-c2ist "beste Anstrengung" und -n7ist die niedrigste "beste Anstrengung" Priorität. Dadurch wird der Job gedrosselt, um die E / A-Priorität niedriger als bei den meisten anderen Dingen im System zu senken.

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

-c3(keine Prioritätsstufe erforderlich) bedeutet "Nur Leerlauf". Jobs, die -c3NUR für die Leerlaufplanung vorgesehen sind, haben praktisch keine Auswirkungen auf das System - möglicherweise jedoch eine erheblich längere Ausführungszeit für Ihren Job, je nachdem, wie beschäftigt der Rest des Systems ist.

Jim Salter
quelle
Wie würde ich nicein einen Konvertierungsbefehl integrieren ? Wenn ich nichts falsch mache, funktioniert es gut, wenn Prozesse bereits ausgeführt werden.
Zu tun
1
Siehe oben ... Lesen Sie auch die Manpage. Es ist eine sehr einfache Manpage, überhaupt nicht zäh. :-)
Jim Salter
Ich versuchte es. Irgendwie geholfen, aber nicht genug. Ich werde es das nice -n 20nächste Mal versuchen .
Zu tun
Ehrlich gesagt bin ich mir nicht sicher, ob die CPU-Auslastung hier Ihr Problem ist. Haben Sie es versucht, iotopwährend Sie den Prozess ausführen? Normalerweise hat ein einzelner Prozess, der viel CPU verbraucht, nur sehr geringe Auswirkungen auf die Benutzerfreundlichkeit des Systems. Ein Prozess, der die Festplatte überlastet, kann jedoch SEHR schnell zum Stillstand kommen - insbesondere, wenn Sie ein herkömmliches Laufwerk und keine SSD verwenden.
Jim Salter
Da das gesamte System für Sie ziemlich unbrauchbar wird, können Sie etwas in der Art versuchen, convert blah.gif blah.jpg & iotopdass iotopes sofort ausgelöst wird, sobald Sie Ihren convertJob begonnen haben.
Jim Salter
2

Hier ist ein ziemlich guter Artikel über die Verwendung eines Programms, das aufgerufen wird cpulimit, um die CPU-Auslastung eines Prozesses zu begrenzen:

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

Das Problem ist, wie Sie sagten, die PID des convertProzesses zu finden, nachdem er gestartet wurde.

convertWenn Sie nach dem Start noch Befehle in das Terminal eingeben können ps aux | grep convert, können Sie die PID ermitteln und dann sudo cpulimit -p PID -l CPU%mit der Drosselung beginnen.

Wenn das Starten convertauch Ihr Terminal blockiert, zeigt Ihnen der Artikel, wie Sie cpulimitals Hintergrunddämon ausgeführt werden können, der Prozesse über eine bestimmte CPU-Auslastung automatisch überwacht und drosselt. Viel Glück!

glatt-texan
quelle
Dieses Skript ist eine schlechte Idee und im Vergleich zum integrierten niceBefehl primitiv . cpulimitbegrenzt den Prozess auf einen bestimmten Prozentsatz der CPU-Auslastung, unabhängig davon, ob etwas anderes die CPU-Zeit benötigt oder nicht; niceIm Gegensatz dazu werden Prioritätsstufen (insgesamt 40!) festgelegt, mit denen eine Aufgabe über (oder unter) anderen Aufgaben priorisiert werden kann.
Jim Salter