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