Come posso limitare un comando in una finestra del terminale?


8

Avevo bisogno di correre convertcon molte immagini contemporaneamente. Il comando è durato un po ', ma questo non mi dà fastidio.

Il problema è che questo comando ha reso il mio computer inutilizzabile mentre il comando era in esecuzione (per circa 15 minuti).

Quindi è possibile limitare il comando limitando le risorse (processore e memoria) al comando, direttamente dalla riga di comando? Questo può funzionare solo se aggiungo qualcosa alla stessa riga prima di premere Enterperché una volta avviato il processo il computer rallenta così tanto che è impossibile, ad esempio, passare a "Monitor di sistema" e ridurre la priorità.

Modifica: risultati top e iotop

Sono riuscito a correre tope sudo iotop >iotop.txtmentre eseguivo una di queste operazioni di conversione. (Il file iotop.txt prodotto è difficile da leggere)

Risultati dei migliori:

   PID UTENTE PR NI VIRT RES SHR S% CPU% MEM TIME + COMANDO           
14275 nome utente 20 0 4043m 3.0g 1448 D 7.0 80.4 0: 16.45 convert 

Risultati di iotop:

[? 1049h [1; 24r (B [m [4l [? 7h [? 1h = [39; 49m [? 25l [39; 49m (B [m [H [2 [H [2JTOTAL DISK READ: 1269.04 K / s | SCRIV. DISCO totale : [59G0.00 B / s
(B [0; 7m TID PRIO DISCO UTENTE LEGGI DISCO SCRIVI 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 nome utente 568,88 K / s 0,00 B / s 77,41% 0,00% --rendere ~ .530483991 [5; 1H14275 nome utente inattivo 350,08 K / s 0,00 B / s 37,49% 0,00% convertire 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

Inoltre, anche al termine del processo, il computer non torna alle prestazioni precedenti. Ho trovato un modo per aggirare correndo sudo swapoff -aseguito dasudo swapon -a

Risposte:


5

Oh, ragazzo, ho appena preso questo ... citando OP:

Inoltre, anche al termine del processo, il computer non torna alle prestazioni precedenti. Ho trovato un modo per aggirare correndo sudo swapoff -aseguito dasudo swapon -a

OK, questo significa che stavi esaurendo la RAM disponibile sul tuo sistema, il che significa che stai semplicemente cercando di eseguire troppi convertprocessi contemporaneamente. Dovremmo esaminare la tua sintassi reale in spawning convertper avvisare, ma in sostanza, devi assicurarti di non provare ad aprire più processi simultanei di quanti ne abbia la RAM da gestire comodamente.

Dato che affermi che cosa sta causando questo convert *.tif blah.pdf, ciò che sta accadendo è che il contenuto di ogni singolo TIF e la sua conversione in PDF vengono inseriti nella RAM contemporaneamente. Quello che devi fare è dividere il lavoro in modo che non sia necessario. Una possibilità che viene in mente è invece fare qualcosa di simile find . -iname '*.tif' | xargs -I% convert % %.pdf, quindi utilizzare pdftko qualcosa del genere per incollare tutti i singoli pdf insieme. Se vuoi davvero essere sofisticato e hai una CPU multicore, questo ti dà anche la possibilità di scrivere un piccolo script per eseguire conversioni in lotti di n , dove n è il tuo numero di core, e fare tutto in modo significativamente più veloce . :)

Come fare pdftk: http://ubuntuhowtos.com/howtos/merge_pdf_files (sostanzialmente si riduce a sudo apt-get install pdftk; pdftk *.pdf cat output merged.pdf)


Sto solo eseguendo UN convert *.tif bla.pdfPROCESSO alla volta, ma l'input è un sacco di immagini tif. È un modo per produrre un pdf da un mucchio di immagini che funziona bene ma soffoca il mio pc.
Da fare il

^^ vedi risposta modificata per favore :)
Jim Salter,

Questo ha funzionato perfettamente con una semplice modifica. find . -iname '*.tif' | xargs -I% convert % %.pdfinvece di find . -iname '*.pdf' | xargs -I% convert % %.pdf. È stato anche più veloce! Grazie.
Da fare il

Siamo spiacenti, malfunzionamento tra cervello e dita :-)
Jim Salter,

Una piccola modifica ... È una buona cosa conoscere le opzioni -exece -execdirper find. Nel tuo caso, invece di usare xargs, userei:find -iname '*.tif' -execdir convert {} {}.pdf ';'
Paddy Landau il

12

man nice, E se avete bisogno di I / O di strozzamento man ionice.

Diamo un'occhiata ad alcuni semplici esempi.

Limitazione dell'utilizzo della CPU:

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

Dalla tua descrizione, tuttavia, l'utilizzo della CPU non è quasi certamente il tuo vero problema qui. Più probabilmente, si verificano gravi conflitti di I / O.

Utilizzo del disco di limitazione:

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

-c2è il "miglior sforzo" ed -n7è la priorità più bassa del "miglior sforzo". Quindi, questo rallenterà il lavoro per ridurre la priorità I / O rispetto alla maggior parte delle altre cose sul sistema.

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

-c3(nessun livello di priorità necessario) significa "Solo inattivo". I lavori impostati su -c3SOLO occupano altrimenti tempo di programmazione del disco inattivo, praticamente senza alcun impatto sul sistema, ma potenzialmente un tempo di esecuzione considerevolmente più lungo per il lavoro, a seconda di quanto è occupato il resto del sistema.


Come potrei integrarmi nicein un comando convert? Se non sbaglio, funziona bene per i processi già in esecuzione.
Da fare il

1
Vedi sopra ... Srsly, leggi anche la pagina man. È una pagina man molto semplice, per nulla gommosa. :-)
Jim Salter,

L'ho provato. Un po 'aiutato ma non abbastanza. Ci proverò la nice -n 20prossima volta.
Da fare il

Onestamente non sono troppo sicuro che il carico della CPU sia il tuo problema qui. Hai provato a farlo iotopdurante l'esecuzione del processo? Di solito un singolo processo che consuma molta CPU avrà un effetto molto scarso sull'usabilità del sistema, ma un processo che schiaccia il disco rigido può MOLTO rapidamente arrestare tutto, specialmente se si utilizza un disco convenzionale, non un SSD.
Jim Salter,

Poiché l'intero sistema diventa piuttosto inutilizzabile per te, potresti provare qualcosa del genere in convert blah.gif blah.jpg & iotopmodo che iotopsi accenda all'istante non appena hai iniziato il tuo convertlavoro.
Jim Salter,

2

Ecco un buon articolo sull'uso di un programma chiamato cpulimitper limitare l'utilizzo della cpu di qualsiasi processo:

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

Il problema è come hai detto di trovare il PID del convertprocesso dopo che è stato avviato.

Dopo l'avvio, convertse è ancora possibile digitare comandi nel terminale, è possibile eseguire ps aux | grep convertper trovare il PID, quindi sudo cpulimit -p PID -l CPU%avviare la limitazione.

Oppure, se l'avvio convertblocca anche il tuo terminale, l'articolo mostra come eseguire cpulimitun demone in background che monitorerà e limiterà automaticamente tutti i processi su un determinato utilizzo della CPU. In bocca al lupo!


Questo script è una cattiva idea e primitivo rispetto al nicecomando integrato . cpulimitlimiterà il processo a un certo% di utilizzo della CPU indipendentemente dal fatto che qualcos'altro richieda o meno il tempo della CPU; nice, al contrario, imposta livelli di priorità (40 in totale!) che consentono di stabilire le priorità di un'attività sopra (o sotto) le altre.
Jim Salter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.