Limit CPU предел процесса в цикле

Я пытаюсь казнить ffmpeg в цикле по нескольким файлам. Я хочу, чтобы за один раз запускался только один экземпляр, и чтобы он использовал только 50% процессора. Я пытался cpulimit но это не играет хорошо с петлей.

for i in {1..9}; do cpulimit -l 50 -- ffmpeg <all the options>; done

Это порождает все девять рабочих мест одновременно, и все они принадлежат init поэтому я должен открыть htop убить их.

for i in {1..9}; do ffmpeg <all the options> & cpulimit -p $! -l 50; done

Это висит, ctrl+c продолжается до следующей итерации цикла. Эти случаи могут быть убиты только SIGKILL,

2 ответа

Решение

Использование очереди это путь. Простое решение, которое я использую, это Task Spooler. Вы можете ограничить количество ядер, используемых ffmpeg с -threads также. Вот код для вас:

ts sh -c "ffmpeg -i INPUT.mp4 -threads 4 OUTPUT.mp4"
  • Вы можете установить максимальное количество одновременных задач на 1 с помощью: ts -S 1
  • Чтобы увидеть текущую очередь, просто запустите ts

Вы должны запустить его на переднем плане. Таким образом, цикл будет работать должным образом.

$ cpulimit --help
...
-f  --foreground   launch target process in foreground and wait for it to exit

У меня это работает.

for file in *.mp4; do
    cpulimit -f -l 100 -- ffmpeg -i "$file" <your options>
done

Если вы хотите, чтобы опция -threads влияла на кодировщик, вы должны поместить ее после аргумента -i, перед выходным именем файла - ваша текущая опция говорит только части декодирования использовать один поток. Таким образом, чтобы сохранить все это с помощью одного потока, вам нужно -threads 1 как до, так и после параметра -i. так что вы можете сделать это так:

ffmpeg -threads 1 -i INPUT.mp4 -threads 1 OUTPUT.mp4

Другие вопросы по тегам