Как настроить команду в окне терминала?

8

Мне нужно было работать convertс большим количеством изображений одновременно. Команда заняла довольно много времени, но это меня не беспокоит.

Проблема в том, что эта команда сделала мой компьютер непригодным для использования во время выполнения команды (около 15 минут).

Так можно ли ограничить команду, ограничивая ресурсы (процессор и память) командой непосредственно из командной строки? Это может сработать, только если я добавлю что-то в ту же строку перед нажатием, Enterпотому что после запуска процесса компьютер замедляется настолько, что невозможно, например, переключиться на «Монитор системы» и уменьшить приоритет.

Изменить: топ и результаты iotop

Мне удалось запустить topи sudo iotop >iotop.txtво время выполнения одной из этих операций преобразования. (Созданный файл iotop.txt трудно читать)

Результаты топа:

   PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + КОМАНДА           
14275 имя пользователя 20 0 4043 м 3,0 г 1448 D 7,0 80,4 0: 16,45 конвертировать 

Результаты iotop:

[? 1049h [1; 24r (B [м [4l [? 7h]?? 1h = [39; 49 м [? 25l [39; 49 м (B [м [H] [2JTotal DISK READ: 1269,04 K / с | Всего DISK WRITE) : [59G0,00 б / с
(B [0; 7m TID PRIO ПОЛЬЗОВАТЕЛЬСКИЙ ДИСК READ DISK WRITE SWAPIN (B [0; 1; 7m IO> (B [0; 7m COMMAND [3; 2H (B [m2516 be / 4 имя пользователя 350.08 K / s 0.00 B / с 0,00% 0,00% Zeitgeist-DataHub
 7394 be / 4 username 568.88 K / s 0.00 B / s 77.41% 0.00% --rendere ~ .530483991 [5; 1H14275 бездействующий имя пользователя 350.08 K / s 0.00 B / s 37.49% 0.00% конвертировать S ~ f test.pdf [6 ; 2H2048 be / 4 корень [6; 24H0,00 B / с 0,00 B / с 0,00% 0,00% [kworker / 3: 2]
[5G1 be / 4 корень [7; 24H0,00 B / с 0,00 B / с 0,00% 0,00% init

Кроме того, даже после завершения процесса компьютер не возвращается к предыдущему результату. Я нашел способ обойти это бегом, sudo swapoff -aа затемsudo swapon -a

Делать
источник

Ответы:

5

О, мальчик, я только что поймал это ... цитируя ОП:

Кроме того, даже после завершения процесса компьютер не возвращается к предыдущему результату. Я нашел способ обойти это бегом, sudo swapoff -aа затемsudo swapon -a

Итак, это означает, что вы исчерпали доступную оперативную память в своей системе, а это значит, что вы просто пытаетесь запустить слишком много convertпроцессов одновременно. convertЧтобы посоветоваться, нам нужно посмотреть на ваш фактический синтаксис , но в основном вам нужно убедиться, что вы не пытаетесь открыть больше одновременных процессов, чем у вас есть оперативная память для удобной обработки.

Поскольку вы указываете, что является причиной этого convert *.tif blah.pdf, то, что происходит, заключается в том, что содержимое каждого отдельного TIF-файла и его преобразование в PDF-файлы сразу помещаются в оперативную память. То, что вам нужно сделать, это разделить работу так, чтобы в этом не было необходимости. Одна возможность, которая приходит в голову - вместо этого делать что-то вроде find . -iname '*.tif' | xargs -I% convert % %.pdf, затем использовать pdftkили что-то вроде этого, чтобы склеить все отдельные PDF-файлы вместе. Если вы действительно хотите проявить фантазию, и у вас многоядерный процессор, это также дает вам возможность написать небольшой скрипт для запуска преобразований в пакетах из n , где n - количество ваших ядер, и сделать все это значительно быстрее. , :)

pdftk с практическими рекомендациями: http://ubuntuhowtos.com/howtos/merge_pdf_files (в основном сводится к sudo apt-get install pdftk; pdftk *.pdf cat output merged.pdf)

Джим Солтер
источник
Я просто запускаю ОДИН convert *.tif bla.pdfпроцесс за один раз, но ввод - целая куча tif-изображений. Это способ создать один PDF-файл из набора изображений, который работает хорошо, но душит мой компьютер.
Делать
^^ см. отредактированный ответ, пожалуйста :)
Джим Салтер
Это отлично работало с одной простой модификацией. find . -iname '*.tif' | xargs -I% convert % %.pdfвместо find . -iname '*.pdf' | xargs -I% convert % %.pdf. Это тоже было быстрее! Спасибо.
Делать
Извините, неисправность между мозгом и пальцами :-)
Джим Солтер
Одна небольшая модификация ... Это хорошая вещь , чтобы знать о -execи -execdirопции для find. В вашем случае вместо использования xargsя бы использовал:find -iname '*.tif' -execdir convert {} {}.pdf ';'
Paddy Landau
12

man niceи если вам нужно регулирование ввода / вывода man ionice.

Давайте посмотрим на несколько простых примеров.

Регулирование загрузки процессора:

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

Однако, по вашему описанию, использование процессора почти наверняка не является вашей реальной проблемой. Скорее всего, у вас серьезный конфликт ввода-вывода.

Использование дроссельного диска:

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

-c2это «лучшее усилие» и -n7является самым низким приоритетом «лучшее усилие». Таким образом, это приведет к сокращению задания для снижения приоритета ввода / вывода по сравнению с большинством других функций в системе.

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

-c3(уровень приоритета не требуется) означает «Только в режиме ожидания». Задания, настроенные -c3ТОЛЬКО, занимают в противном случае время планирования простоя диска, практически не влияя на систему, но потенциально значительно более длительное время выполнения вашей работы, в зависимости от того, насколько занята остальная часть системы.

Джим Солтер
источник
Как бы я интегрировать niceв команду конвертировать? Если я не ошибаюсь, хорошо работает для уже запущенных процессов.
Делать
1
Смотрите выше ... Также, srsly, прочитайте справочную страницу. Это очень простая справочная страница, совсем не жевательная. :-)
Джим Сэлтер
Я попробовал это. Вроде помогло, но недостаточно. Я попробую в nice -n 20следующий раз.
Делать
Честно говоря, я не слишком уверен, что загрузка процессора - ваша проблема здесь. Вы пытались делать iotopво время запуска процесса? Обычно один процесс, потребляющий много ресурсов ЦП, будет очень мало влиять на удобство использования системы, но процесс, перебивающий жесткий диск, может ОЧЕНЬ быстро привести к полной остановке, особенно если вы используете обычный диск, а не SSD.
Джим Сэлтер
Поскольку вся система становится для вас непригодной для использования, вы можете попробовать что-то в этом роде, convert blah.gif blah.jpg & iotopчтобы iotopона сразу же включилась, как только вы приступили к convertработе.
Джим Солтер
2

Вот довольно хорошая статья об использовании программы, которая называется cpulimitдля ограничения использования процессором любого процесса:

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

Проблема в том, что вы сказали, что нашли PID convertпроцесса после его запуска.

После запуска, convertесли вы все еще можете вводить команды в терминале, вы можете запустить, ps aux | grep convertчтобы найти его PID, а затем sudo cpulimit -p PID -l CPU%начать регулирование.

Или, если запуск convertтакже блокирует ваш терминал, в статье показано, как вы можете работать cpulimitв качестве фонового демона, который будет автоматически контролировать и регулировать любые процессы при определенной загрузке процессора. Удачи!

сглаживать-техасец
источник
Этот скрипт плохая идея и примитивен по сравнению со встроенной niceкомандой. cpulimitограничит процесс определенным процентом использования ЦП независимо от того, нужно ли что-либо еще время ЦП; niceнапротив, устанавливает уровни приоритета (всего 40!), которые позволяют определить приоритетность одной задачи над (или ниже) другой.
Джим Солтер